diff --git a/lab on ORM/movies.py b/lab on ORM/movies.py new file mode 100644 index 0000000000000000000000000000000000000000..0a039eb4ccbd8f11434706ca195768143ad63ec4 --- /dev/null +++ b/lab on ORM/movies.py @@ -0,0 +1,65 @@ +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) + #reltionship means that a table is communicating withi another + #the use list means that SQL Alehcmy will return a list of things + #secondary means there's a junciton table involved + #back_populates just means the rest of the table squirsm with eveyrthing else. updates + genres = relationship('Genre', uselist=True, secondary='movie_genres', back_populates='movies') + 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', back_populates='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()