diff --git a/freebies.db b/freebies.db new file mode 100644 index 000000000..bd49a546b Binary files /dev/null and b/freebies.db differ diff --git a/lib/__pycache__/models.cpython-38.pyc b/lib/__pycache__/models.cpython-38.pyc new file mode 100644 index 000000000..1cf198aa9 Binary files /dev/null and b/lib/__pycache__/models.cpython-38.pyc differ diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..5de2d36aa 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,26 @@ #!/usr/bin/env python3 from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker -from models import Company, Dev +from models import Company, Dev, Freebie, Base if __name__ == '__main__': engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() + + print("Debug session begins...") + print(f'Companies:{session.query(Company).all()}') + print(f'Devs: {session.query(Dev).all()}') + print(f'Freebies: {session.query(Freebie).all()}') + print("Debug session ends.") + + + + import ipdb; ipdb.set_trace() + + + + diff --git a/lib/migration.py b/lib/migration.py new file mode 100644 index 000000000..dec024ccb --- /dev/null +++ b/lib/migration.py @@ -0,0 +1,16 @@ +from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, ForeignKey +from models import Base + +def migrate(): + engine =create_engine('sqlite:///freebies.db') + + print(f"Tables before migration:{Base.metadata.tables.keys()}") + + Base.metadata.create_all(engine) + + print(f"Tables after migration: {Base.metadata.tables.keys()}") + + print("Migration completed successfullly!") + +if __name__ == '__main__': + migrate() \ No newline at end of file diff --git a/lib/models.py b/lib/models.py index 2681bee5a..a7734565b 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,12 +1,15 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData -from sqlalchemy.orm import relationship, backref -from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy import ForeignKey, Column, Integer, String, MetaData,create_engine +from sqlalchemy.orm import relationship,sessionmaker,declarative_base +from sqlalchemy.orm import registry + +#create engine +engine =create_engine('sqlite:///freebies.db') +Session =sessionmaker(bind=engine) convention = { "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", } metadata = MetaData(naming_convention=convention) - Base = declarative_base(metadata=metadata) class Company(Base): @@ -16,8 +19,35 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + #relationship with freebie + freebies=relationship('Freebie',back_populates='company') + + #relationship with dev through Freebie + devs=relationship('Dev',secondary='freebies',back_populates='companies',overlaps='freebies') + def __repr__(self): return f'' + + def give_freebie(self, dev,item_name,value): + session=Session() + new_freebie=Freebie( + item_name=item_name, + value=value, + company=self, + dev=dev + ) + session.add(new_freebie) + session.commit() + session.close() + return new_freebie + @classmethod + def oldest_company(cls): + session=Session() + oldest=session.query(cls).order_by(cls.founding_year).first() + session.close() + return oldest + + class Dev(Base): __tablename__ = 'devs' @@ -25,5 +55,49 @@ class Dev(Base): id = Column(Integer(), primary_key=True) name= Column(String()) + + #relationship with Freebie + freebies=relationship('Freebie',back_populates='dev') + + #relationship with company through Freebie + companies=relationship('Company',secondary='freebies',back_populates='devs',overlaps='freebies') + + + 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,recipient_dev,freebie): + session=Session() + if freebie in self.freebies: + freebie.dev_id=recipient_dev + session.commit() + session.close() + return True + session.close() + #else: + return False + +class Freebie(Base): + __tablename__ = 'freebies' + + id =Column(Integer(), primary_key=True) + item_name = Column(String()) + value = Column(Integer()) + + dev_id=Column(Integer, ForeignKey('devs.id')) + company_id=Column(Integer, ForeignKey('companies.id')) + + #relationship with Dev and company through freebie + dev=relationship('Dev',back_populates='freebies',overlaps='companies,devs') + company=relationship('Company',back_populates='freebies', overlaps='devs,companies') + + def __repr__(self): + return f'' + + def print_details(self): + return f'{self.dev.name} owns a {self.item_name} from {self.company.name}' diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..a0ddade03 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,67 @@ #!/usr/bin/env python3 # Script goes here! + +from sqlalchemy import create_engine +from models import Company, Dev, Freebie, Base +from sqlalchemy.orm import sessionmaker + + +engine=create_engine('sqlite:///freebies.db') +Session=sessionmaker(bind=engine) +session=Session() + +#clear existing data +session.query(Freebie).delete() +session.query(Dev).delete() +session.query(Company).delete() +session.commit() + +# Create companies +google=Company(name='Google',founding_year=1998) +microsoft=Company(name='Microsoft',founding_year=1975) +tesla=Company(name='Tesla',founding_year=2003) +meta=Company(name='Meta',founding_year=2015) + +#Add companies to the session +session.add_all([google, meta, tesla, microsoft]) +session.commit() + +#create devs +bill_gates=Dev(name="Bill Gates") +mark_zuckerberg=Dev(name="Mark Zuckerberg") +larry_page=Dev(name="Larry Page") +elon_musk=Dev(name="Elon Musk") + +#Add devs to the session +session.add_all([bill_gates, mark_zuckerberg, elon_musk, larry_page]) +session.commit() + +#Create freebies +# bill_gates.freebies.append(Freebie(item_name="Macbook Pro",value=10, company_id=microsoft.id)) +# larry_page.freebies.append(Freebie(item_name="google pixel",value=5, company_id=google.id)) +# elon_musk.freebies.append(Freebie(item_name="Tesla Model X", company_id=tesla.id)) +# mark_zuckerberg.freebies.append(Freebie(item_name="games", value=8, company_id=meta.id)) + +freebies=[ + Freebie(item_name="Macbook Pro",value=10, company=microsoft, dev=bill_gates), + Freebie(item_name="google pixel",value=5, company=google, dev=larry_page), + Freebie(item_name="Tesla Model X",value=50, company=tesla, dev=elon_musk), + Freebie(item_name="Games", value=8, company=meta, dev=mark_zuckerberg) +] + +#Add freebies to the session +session.add_all(freebies) +session.commit() + +#Print test data +print(f"All companies: {session.query(Company).all()}") +print(f"All devs: {session.query(Dev).all()}") +print(f"All freebies: {session.query(Freebie).all()}") +print(f"Bill Gates' freebies: {session.query(Freebie).join(Dev).filter(Dev.name=='Bill Gates').all()}") +print(f"Freebies for Google: {session.query(Freebie).join(Company).filter(Company.name=='Google').all()}") +session.close() + + + +