From dd08bb27cd96fae38955cdbc27cc45b1e34fe481 Mon Sep 17 00:00:00 2001 From: phoebe velma awuor Date: Tue, 11 Mar 2025 19:02:39 +0300 Subject: [PATCH 1/2] complete --- lib/debug.py | 16 +++++- lib/freebies.db | Bin 20480 -> 28672 bytes .../237721f46ab1_added_freebie_table.py | 46 ++++++++++++++++++ .../6a834d408ee0_create_freebies_table.py | 31 ++++++++++++ lib/models.py | 37 ++++++++++++-- lib/seed.py | 45 ++++++++++++++++- 6 files changed, 169 insertions(+), 6 deletions(-) create mode 100644 lib/migrations/versions/237721f46ab1_added_freebie_table.py create mode 100644 lib/migrations/versions/6a834d408ee0_create_freebies_table.py diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..6a686aec3 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,21 @@ #!/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 +# Set up database connection +engine = create_engine('sqlite:///freebies.db') +Session = sessionmaker(bind=engine) +session = Session() if __name__ == '__main__': - engine = create_engine('sqlite:///freebies.db') + print("\nDebug session started. Use session.query(Model).all() to view data.") + print("Available Models: Company, Dev, Freebie") + print("Example Queries:") + print(" session.query(Company).all() # View all companies") + print(" session.query(Dev).all() # View all developers") + print(" session.query(Freebie).all() # View all freebies") + print("\nTip: Use dev.freebies, company.devs, freebie.print_details(), etc.") + import ipdb; ipdb.set_trace() diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c963e832db481e7a7493e3029e691ac4dc..03240a3ed40b2492cad385a6897932905c442f6c 100644 GIT binary patch delta 905 zcmaJ^8}EC&AVb+mN9kZKeM72Ma~0n{@l5X<9a^AP8ZTOqwOhPDr+a z>Y@1d+&Yo@n+Va!u3yZ zqsQ+707wij2FT#q92yOJz=hg_PUQ@6$q1lM^jdx;J01a~ZJOBUy delta 248 zcmZp8z}T>Wae}lUD+2=q2*UvLL>*&MRtCLzSzi7h3@m(74E((OJNfGQq&5o*EaO#A zW?>f>6=iJHEJ;ktNli&DD+Xa!=O9 None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('companies', schema=None) as batch_op: + batch_op.alter_column('name', + existing_type=sa.VARCHAR(), + nullable=False) + + with op.batch_alter_table('devs', schema=None) as batch_op: + batch_op.alter_column('name', + existing_type=sa.VARCHAR(), + nullable=False) + + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('devs', schema=None) as batch_op: + batch_op.alter_column('name', + existing_type=sa.VARCHAR(), + nullable=True) + + with op.batch_alter_table('companies', schema=None) as batch_op: + batch_op.alter_column('name', + existing_type=sa.VARCHAR(), + nullable=True) + + # ### end Alembic commands ### diff --git a/lib/migrations/versions/6a834d408ee0_create_freebies_table.py b/lib/migrations/versions/6a834d408ee0_create_freebies_table.py new file mode 100644 index 000000000..1d352e3ba --- /dev/null +++ b/lib/migrations/versions/6a834d408ee0_create_freebies_table.py @@ -0,0 +1,31 @@ +"""Create freebies table + +Revision ID: 6a834d408ee0 +Revises: 5f72c58bf48c +Create Date: 2025-03-11 12:22:31.115915 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '6a834d408ee0' +down_revision = '5f72c58bf48c' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'freebies', + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('item_name', sa.String, nullable=False), + sa.Column('value', sa.Integer, nullable=False), + sa.Column('company_id', sa.Integer, sa.ForeignKey('companies.id')), + sa.Column('dev_id', sa.Integer, sa.ForeignKey('devs.id')) + ) + + +def downgrade(): + op.drop_table('freebies') diff --git a/lib/models.py b/lib/models.py index 2681bee5a..733cb1f7c 100644 --- a/lib/models.py +++ b/lib/models.py @@ -13,17 +13,48 @@ class Company(Base): __tablename__ = 'companies' id = Column(Integer(), primary_key=True) - name = Column(String()) + name = Column(String(), nullable=False) founding_year = Column(Integer()) + + freebies = relationship("Freebie", back_populates="company", cascade="all, delete-orphan") + + + devs = relationship("Dev", secondary="freebies", back_populates="companies", overlaps="freebies") + def __repr__(self): - return f'' + return f'' class Dev(Base): __tablename__ = 'devs' id = Column(Integer(), primary_key=True) - name= Column(String()) + name = Column(String(), nullable=False) + + + freebies = relationship("Freebie", back_populates="dev", cascade="all, delete-orphan") + + + companies = relationship("Company", secondary="freebies", back_populates="devs", overlaps="freebies") def __repr__(self): return f'' + +class Freebie(Base): + __tablename__ = 'freebies' + + id = Column(Integer(), primary_key=True) + item_name = Column(String(), nullable=False) + value = Column(Integer(), nullable=False) + company_id = Column(Integer(), ForeignKey('companies.id')) + dev_id = Column(Integer(), ForeignKey('devs.id')) + + + company = relationship("Company", back_populates="freebies", overlaps="devs,companies") + dev = relationship("Dev", back_populates="freebies", overlaps="devs,companies") + + def print_details(self): + return f"{self.dev.name} owns a {self.item_name} from {self.company.name}" + + def __repr__(self): + return f'' diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..82f9b17cd 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,46 @@ #!/usr/bin/env python3 -# Script goes here! +from models import Company, Dev, Freebie +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + + +engine = create_engine('sqlite:///freebies.db') +Session = sessionmaker(bind=engine) +session = Session() + + +session.query(Freebie).delete() +session.query(Dev).delete() +session.query(Company).delete() + +# Add companies +company1 = Company(name="Google", founding_year=1998) +company2 = Company(name="Microsoft", founding_year=1975) +company3 = Company(name="Apple", founding_year=1976) +company4 = Company(name="Amazon", founding_year=1994) + +# Add developers +dev1 = Dev(name="Alice Johnson") +dev2 = Dev(name="Bob Smith") +dev3 = Dev(name="Charlie Davis") +dev4 = Dev(name="Dana Lee") + +# Add freebies +freebie1 = Freebie(item_name="T-shirt", value=20, company=company1, dev=dev1) +freebie2 = Freebie(item_name="Sticker Pack", value=5, company=company2, dev=dev2) +freebie3 = Freebie(item_name="Notebook", value=10, company=company3, dev=dev3) +freebie4 = Freebie(item_name="Mug", value=15, company=company4, dev=dev4) +freebie5 = Freebie(item_name="Pen", value=3, company=company1, dev=dev2) +freebie6 = Freebie(item_name="Hoodie", value=50, company=company2, dev=dev3) +freebie7 = Freebie(item_name="Backpack", value=60, company=company3, dev=dev4) +freebie8 = Freebie(item_name="USB Drive", value=25, company=company4, dev=dev1) + +# Add all to session and commit +session.add_all([company1, company2, company3, company4, dev1, dev2, dev3, dev4, + freebie1, freebie2, freebie3, freebie4, freebie5, freebie6, freebie7, freebie8]) + +session.commit() + +print("Database seeded successfully!") + From 92787b30fa8777fec57c0aeb5b39c3b89fb4d8da Mon Sep 17 00:00:00 2001 From: phoebe velma awuor Date: Fri, 14 Mar 2025 16:39:23 +0300 Subject: [PATCH 2/2] complete --- lib/freebies.db | Bin 28672 -> 28672 bytes lib/models.py | 14 ++++++++++++++ 2 files changed, 14 insertions(+) diff --git a/lib/freebies.db b/lib/freebies.db index 03240a3ed40b2492cad385a6897932905c442f6c..a9db941e23c303bec82c446045f42c6d26ce460b 100644 GIT binary patch delta 19 acmZp8z}WDBae_1>_e2?IM(&LX3-SR)JqDHl delta 19 acmZp8z}WDBae_1>*F+g-My`zs3-SR)E(VkU diff --git a/lib/models.py b/lib/models.py index 733cb1f7c..eecdcfe81 100644 --- a/lib/models.py +++ b/lib/models.py @@ -58,3 +58,17 @@ def print_details(self): def __repr__(self): return f'' + + +#1. Get a Developer and Their Freebies, companies + #dev = session.query(Dev).filter_by(name="Alice Johnson").first() + #dev.freebies + #dev.companies +#2. Get a Company and Their Freebies,devs + # company = session.query(Company).filter_by(name="Google").first() + # company.freebies + #company.devs +#3. Get a Freebie and Its Dev & Company + #freebie = session.query(Freebie).filter_by(item_name="T-shirt").first() + #freebie.dev + #freebie.company \ No newline at end of file