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()