diff --git a/lib/__pycache__/models.cpython-312.pyc b/lib/__pycache__/models.cpython-312.pyc new file mode 100644 index 000000000..90c44a30c Binary files /dev/null and b/lib/__pycache__/models.cpython-312.pyc differ diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..0b8986eeb 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,40 @@ #!/usr/bin/env python3 from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Company, Dev, Freebie -from models import Company, Dev +# Connect to the database +engine = create_engine('sqlite:///freebies.db') +Session = sessionmaker(bind=engine) +session = Session() -if __name__ == '__main__': - engine = create_engine('sqlite:///freebies.db') - import ipdb; ipdb.set_trace() + +import ipdb; ipdb.set_trace() + + +company = Company(name="TechCorp", founding_year=2005) +dev1 = Dev(name="Alice") +dev2 = Dev(name="Bob") + + +session.add(company) +session.add(dev1) +session.add(dev2) +session.commit() + + +company.give_freebie(dev1, "T-Shirt", 10) + + +freebie = session.query(Freebie).first() +print(freebie.print_details()) + + +print(dev1.received_one("T-Shirt")) + + +dev1.give_away(dev2, freebie) + + +print(freebie.dev.name) diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c96..b2ebfd030 100644 Binary files a/lib/freebies.db and b/lib/freebies.db differ diff --git a/lib/models.py b/lib/models.py index 2681bee5a..06add1e15 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,29 +1,76 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData -from sqlalchemy.orm import relationship, backref +from sqlalchemy import create_engine, Column, Integer, String, ForeignKey +from sqlalchemy.orm import relationship, declarative_base from sqlalchemy.ext.declarative import declarative_base -convention = { - "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", -} -metadata = MetaData(naming_convention=convention) - -Base = declarative_base(metadata=metadata) +Base = declarative_base() class Company(Base): __tablename__ = 'companies' - id = Column(Integer(), primary_key=True) - name = Column(String()) - founding_year = Column(Integer()) + id = Column(Integer, primary_key=True) + name = Column(String, nullable=False) + founding_year = Column(Integer, nullable=False) + + + devs = relationship('Dev', back_populates='company', cascade='all, delete-orphan') + + + freebies = relationship('Freebie', back_populates='company', cascade='all, delete-orphan') + + def __init__(self, name, founding_year): + self.name = name + self.founding_year = founding_year + + def give_freebie(self, dev, freebie_name, quantity): + + freebie = Freebie(name=freebie_name, quantity=quantity, company=self, dev=dev) + self.freebies.append(freebie) + dev.freebies.append(freebie) + return freebie - def __repr__(self): - return f'' class Dev(Base): __tablename__ = 'devs' - id = Column(Integer(), primary_key=True) - name= Column(String()) + id = Column(Integer, primary_key=True) + name = Column(String, nullable=False) + + + company_id = Column(Integer, ForeignKey('companies.id')) + + + company = relationship('Company', back_populates='devs') + + + freebies = relationship('Freebie', back_populates='dev') + + + + +class Freebie(Base): + __tablename__ = 'freebies' + + id = Column(Integer, primary_key=True) + name = Column(String, nullable=False) + quantity = Column(Integer, nullable=False) + + + company_id = Column(Integer, ForeignKey('companies.id')) + dev_id = Column(Integer, ForeignKey('devs.id')) + + + company = relationship('Company', back_populates='freebies') + dev = relationship('Dev', back_populates='freebies') + + def __init__(self, name, quantity, company, dev): + self.name = name + self.quantity = quantity + self.company = company + self.dev = dev + + + +engine = create_engine('sqlite:///freebies.db', echo=True) + - def __repr__(self): - return f'' +Base.metadata.create_all(engine) diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..9cd5a9a3d 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,78 @@ -#!/usr/bin/env python3 +from models import Company, Dev, Freebie +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker -# Script goes here! + +engine = create_engine('sqlite:///freebies.db') +Session = sessionmaker(bind=engine) +session = Session() + + +engine.execute("PRAGMA foreign_keys = ON") + + + + +company1 = session.query(Company).filter_by(name="TechCorp").first() +if not company1: + company1 = Company(name="TechCorp", founding_year=2000) + session.add(company1) + +company2 = session.query(Company).filter_by(name="DevSolutions").first() +if not company2: + company2 = Company(name="DevSolutions", founding_year=2010) + session.add(company2) + +session.commit() + + +dev1 = session.query(Dev).filter_by(name="Alice").first() +if not dev1: + dev1 = Dev(name="Alice", company=company1) + session.add(dev1) + +dev2 = session.query(Dev).filter_by(name="Bob").first() +if not dev2: + dev2 = Dev(name="Bob", company=company1) + session.add(dev2) + +dev3 = session.query(Dev).filter_by(name="Charlie").first() +if not dev3: + dev3 = Dev(name="Charlie", company_id=company2.id) + session.add(dev3) + +session.commit() + + +freebie1 = session.query(Freebie).filter_by(name="Free Laptop", dev=dev1).first() +if not freebie1: + freebie1 = Freebie(name="Free Laptop", quantity=5, company=company1, dev=dev1) + session.add(freebie1) + +freebie2 = session.query(Freebie).filter_by(name="Free Phone", dev=dev2).first() +if not freebie2: + freebie2 = Freebie(name="Free Phone", quantity=10, company=company1, dev=dev2) + session.add(freebie2) + +freebie3 = session.query(Freebie).filter_by(name="Free Tablet", dev=dev3).first() +if not freebie3: + freebie3 = Freebie(name="Free Tablet", quantity=15, company=company2, dev=dev3) + session.add(freebie3) + +session.commit() + + +print("Companies:") +for company in session.query(Company).all(): + print(f"{company.name} ({company.founding_year})") + +print("\nDevelopers:") +for dev in session.query(Dev).all(): + print(f"{dev.name} from {dev.company.name}") + +print("\nFreebies:") +for freebie in session.query(Freebie).all(): + print(f"{freebie.name} - {freebie.quantity} - {freebie.dev.name} - {freebie.company.name}") + +# Close session +session.close()