Skip to content
Snippets Groups Projects
Commit 8f9f5d59 authored by Brady James Garvin's avatar Brady James Garvin
Browse files

Spun off record-sorting code as its own repository.

parents
No related branches found
No related tags found
No related merge requests found
*.pyc
*.pyo
.idea
bin
main.py 0 → 100644
from sys import stderr
from sqlalchemy.exc import SQLAlchemyError
from movies import MovieDatabase, Genre
from kivy.app import App
class MoviesApp(App):
def __init__(self, **kwargs):
super(MoviesApp, self).__init__(**kwargs)
url = MovieDatabase.construct_mysql_url('localhost', 3306, 'movies', 'root', 'cse')
self.movie_database = MovieDatabase(url)
self.session = self.movie_database.create_session()
def print_records(self):
for genre in self.session.query(Genre):
print(genre.name)
def main():
try:
app = MoviesApp()
app.run()
except SQLAlchemyError as exception:
print('Database connection failed!', file=stderr)
print(f'Cause: {exception}', file=stderr)
exit(1)
if __name__ == '__main__':
main()
Button:
text: 'Print Records'
on_press: app.print_records()
from sqlalchemy import create_engine, Column, Integer, String, Date, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
Persisted = declarative_base()
class Movie(Persisted):
__tablename__ = 'movies'
movie_id = Column(Integer, primary_key=True)
title = Column(String(256), nullable=False)
budget = Column(Integer)
gross_revenue = Column(Integer)
opening_date = Column(Date)
genres = relationship('Genre', uselist=True, secondary='movie_genres')
reviews = relationship('Review', uselist=True, back_populates='movie')
class Review(Persisted):
__tablename__ = 'reviews'
review_id = Column(Integer, primary_key=True)
movie_id = Column(Integer, ForeignKey('movies.movie_id'))
movie = relationship('Movie', back_populates='reviews')
score = Column(Integer)
comments = Column(String(1024))
class Genre(Persisted):
__tablename__ = 'genres'
genre_id = Column(Integer, primary_key=True)
name = Column(String(256), nullable=False)
movies = relationship('Movie', uselist=True, secondary='movie_genres')
class MovieGenre(Persisted):
__tablename__ = 'movie_genres'
movie_id = Column(Integer, ForeignKey('movies.movie_id'), primary_key=True)
genre_id = Column(Integer, ForeignKey('genres.genre_id'), primary_key=True)
votes = Column(Integer)
class MovieDatabase(object):
@staticmethod
def construct_mysql_url(authority, port, database, username, password):
return f'mysql+mysqlconnector://{username}:{password}@{authority}:{port}/{database}'
@staticmethod
def construct_in_memory_url():
return 'sqlite:///'
def __init__(self, url):
self.engine = create_engine(url)
self.Session = sessionmaker()
self.Session.configure(bind=self.engine)
def ensure_tables_exist(self):
Persisted.metadata.create_all(self.engine)
def create_session(self):
return self.Session()
from sys import stderr
from datetime import date
from sqlalchemy.exc import SQLAlchemyError
from movies import MovieDatabase, Movie, Genre, Review
def add_starter_data(session):
biography = Genre(name='Biography')
drama = Genre(name='Drama')
history = Genre(name='History')
action = Genre(name='Action')
adventure = Genre(name='Adventure')
sci_fi = Genre(name='SciFi')
session.add(biography)
session.add(drama)
session.add(history)
session.add(action)
session.add(adventure)
session.add(sci_fi)
# Hidden Figures (Biography, Drama, History)
# 2016 October 15
# Budget: $25,000,000
# Gross Revenue: $206,000,000
# Sample review from IMDB:
# "★★★★★★★★★☆ In the opinion of this reviewer, an extraordinary achievement."
hidden_figures = Movie(title='Hidden Figures', budget=25000000, gross_revenue=206000000,
opening_date=date(2016, 10, 15), genres=[biography, drama, history])
session.add(hidden_figures)
extraordinary_achievement = Review(movie=hidden_figures, score=9,
comments='In the opinion of this reviewer, an extraordinary achievement.')
session.add(extraordinary_achievement)
# Avengers: Infinity War (Action, Adventure)
# 2018 April 27
# Budget: $300,000,000
# Gross Revenue: $2,048,000,000
# Sample reviews from IMDB:
# "★★★★★★★★★★ A summer film that IS even better than the hype."
# "★★★★★★☆☆☆☆ Bordering on a comedy, "Infinity War" is overhyped, lacked direction, but at times impressed."
infinity_war = Movie(title='Avengers: Infinity War', budget=300000000, gross_revenue=2048000000,
opening_date=date(2018, 4, 27), genres=[action, adventure])
session.add(infinity_war)
better_than_hype = Review(movie=infinity_war, score=10,
comments='A summer film that IS even better than the hype.')
bordering_on_comedy = Review(movie=infinity_war, score=6,
comments='Bordering on a comedy, "Infinity War" is overhyped, lacked direction, but '
'at times impressed.')
session.add(better_than_hype)
session.add(bordering_on_comedy)
def main():
try:
url = MovieDatabase.construct_mysql_url('localhost', 3306, 'movies', 'root', 'cse')
movie_database = MovieDatabase(url)
movie_database.ensure_tables_exist()
print('Tables created.')
session = movie_database.create_session()
add_starter_data(session)
session.commit()
print('Records created.')
except SQLAlchemyError as exception:
print('Database setup failed!', file=stderr)
print(f'Cause: {exception}', file=stderr)
exit(1)
if __name__ == '__main__':
main()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment