diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..44521f888 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,24 @@ #!/usr/bin/env python3 - +from models import Dev, Company, Freebie +from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine -from models import Company, Dev + if __name__ == '__main__': engine = create_engine('sqlite:///freebies.db') import ipdb; ipdb.set_trace() + +Session = sessionmaker(bind=engine) +session = Session() + + + +vincent = session.query(Dev).filter_by(name="Vincent").first() +print([company.name for company in vincent.companies]) + +freebie = session.query(Freebie).filter_by(item_name="Mug").first() +print(freebie.print_details()) + +oldest = Company.oldest_company(session) +print(f"Oldest company is: {oldest.name}") diff --git a/lib/models.py b/lib/models.py index 2681bee5a..1fb3e654b 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,7 +1,12 @@ +# Code Interpretation + +#Imports from sqlalchemy import ForeignKey, Column, Integer, String, MetaData from sqlalchemy.orm import relationship, backref +# backref a helper for creating reverse access to relationships from sqlalchemy.ext.declarative import declarative_base +# naming convention for foreign keys to follow convention = { "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", } @@ -9,6 +14,10 @@ Base = declarative_base(metadata=metadata) +# This is how the relationship looks like: +# Company --< Freebie >-- Dev + + class Company(Base): __tablename__ = 'companies' @@ -16,8 +25,29 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + freebies = relationship("Freebie", back_populates="company") + + devs = relationship( + "Dev", + # use the freebies table as the link + secondary="freebies", + # matching Dev.companies + back_populates="companies", + # because we're not storing this directly + viewonly=True, + ) + + # repr -->(representation) def __repr__(self): return f'' + + def give_freebie(self, dev, item_name, value): + return Freebie(item_name=item_name, value=value, dev=dev, company=self) + + @classmethod + def oldest_company(cls, session): + return session.query(cls).order_by(cls.founding_year).first() + class Dev(Base): __tablename__ = 'devs' @@ -25,5 +55,52 @@ class Dev(Base): id = Column(Integer(), primary_key=True) name= Column(String()) + freebies = relationship("Freebie", back_populates="dev") + + companies = relationship( + "Company", + # linking via freebies + secondary="freebies", + # matching Company.devs + back_populates="devs", + # a read only + viewonly=True, + ) + def __repr__(self): return f'' + + def received_one(self, item_name): + return any(freebie.item_name == item_name for freebie in self.freebies) + + def give_away(self, other_dev, freebie): + if freebie.dev == self: + freebie.dev = other_dev + + +# Freebie acts as the intermidiery class + +class Freebie(Base): + __tablename__ = "freebies" + + id = Column(Integer(), primary_key = True) + item_name = Column(String()) + value = Column(Integer()) + + # convention = { + # "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", + # } + dev_id = Column(Integer(), ForeignKey('devs.id')) + company_id = Column(Integer(), ForeignKey('companies.id')) + + + dev = relationship("Dev", back_populates="freebies") + company = relationship("Company", back_populates="freebies") + +# Rep -- method + def __repr__(self): + return f'' + + def print_details(self): + return f"{self.dev.name} owns a {self.item_name} from {self.company.name}" + \ No newline at end of file diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..99172ea0d 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,40 @@ #!/usr/bin/env python3 # Script goes here! + +from sqlalchemy.orm import sessionmaker +from sqlalchemy import create_engine +from models import Base, Company, Dev, Freebie + +# Setuping up the database +engine = create_engine("sqlite:///freebies.db") +Session = sessionmaker(bind=engine) +session = Session() + +# Droping and recreate all tables +Base.metadata.drop_all(engine) +Base.metadata.create_all(engine) + +# The Companies +google = Company(name="Google", founding_year=1998) +amazon = Company(name="Amazon", founding_year=1994) +netflix = Company(name="Netflix", founding_year=1997) + + +# The Devs +vincent = Dev(name="Vincent") +Kimani = Dev(name="Kimani") +Dennis = Dev(name="Dennis") + + +# The Freebies +f1 = Freebie(item_name="Mug", value=10, dev=vincent, company=google) +f2 = Freebie(item_name="T-Shirt", value=15, dev=Kimani, company=amazon) +f3= Freebie(item_name="Water Bottle", value=8, dev=Dennis, company=netflix) + + + +session.add_all([google, amazon, netflix, vincent, Kimani, Dennis, f1, f2, f3]) +session.commit() + +print(" Seed data inserted successfully!")