From 60460cee8ad11b2ee8e74ff8002a1cb0cb16d0c8 Mon Sep 17 00:00:00 2001 From: IsaacDev14 Date: Sun, 25 May 2025 21:20:09 +0300 Subject: [PATCH 01/10] Define Company, Dev, and Freebie models with relationships --- lib/models.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/models.py b/lib/models.py index 2681bee5a..9b39110a6 100644 --- a/lib/models.py +++ b/lib/models.py @@ -27,3 +27,20 @@ class Dev(Base): def __repr__(self): return f'' + + +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')) + + dev = relationship("Dev", backref=backref("freebies", cascade="all, delete-orphan")) + Company = relationship("Company", backref=backref("freebies", cascade="all, delete-orphan")) + + def __ref__(self): + return f'' From e963329fe61fb456397df12822c3ed832fe38b9e Mon Sep 17 00:00:00 2001 From: IsaacDev14 Date: Sun, 25 May 2025 21:22:49 +0300 Subject: [PATCH 02/10] Create migration for companies, devs, and freebies tables --- lib/freebies.db | Bin 20480 -> 24576 bytes ...c3d_create_companies_devs_and_freebies_.py | 37 ++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 lib/migrations/versions/9f1a9693bc3d_create_companies_devs_and_freebies_.py diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c963e832db481e7a7493e3029e691ac4dc..91933571697071b6570c1fe895c41b7917fd6c9a 100644 GIT binary patch delta 406 zcmZozz}Rqrae}lUI|Bm)8xX?)%S0Vxadrm1a4%l|9}KKKyBPR+`FHZw^GWgS+SusA zW6~7M$}TP|%h<|Wl9-f}npTvWnv|JZ45QhcgIpa$TopnboqSvsprVr<`DC0jOHy;= z^AdAY6~Y{YoIMvb$LYY8!DY*Fuxq7<$DR{d^Y9JJ7Dg?Q@xdyrVIlBfc zK!ibxH8N8)@mK(KoH5WH@jx2YV2GWae}lUD+2=q2*UvLL>*&MRtCLzSzi7h3@m(74E((OJNfGQq&5o*EaTlQ e#dk}P$285{DB08^Db2(pd6U8yeiVU41_}T{Q53rX diff --git a/lib/migrations/versions/9f1a9693bc3d_create_companies_devs_and_freebies_.py b/lib/migrations/versions/9f1a9693bc3d_create_companies_devs_and_freebies_.py new file mode 100644 index 000000000..fb0ccdad7 --- /dev/null +++ b/lib/migrations/versions/9f1a9693bc3d_create_companies_devs_and_freebies_.py @@ -0,0 +1,37 @@ +"""Create companies, devs, and freebies tables + +Revision ID: 9f1a9693bc3d +Revises: 5f72c58bf48c +Create Date: 2025-05-25 21:21:57.370108 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '9f1a9693bc3d' +down_revision = '5f72c58bf48c' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('freebies', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('item_name', sa.String(), nullable=True), + sa.Column('value', sa.Integer(), nullable=True), + sa.Column('dev_id', sa.Integer(), nullable=True), + sa.Column('company_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['company_id'], ['companies.id'], name=op.f('fk_freebies_company_id_companies')), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], name=op.f('fk_freebies_dev_id_devs')), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('freebies') + # ### end Alembic commands ### From 270aa5895d495799de6ce1ec48959a52966db04c Mon Sep 17 00:00:00 2001 From: IsaacDev14 Date: Sun, 25 May 2025 21:37:59 +0300 Subject: [PATCH 03/10] Seed Freebie records associated with Dev and Company --- lib/freebies.db | Bin 24576 -> 24576 bytes .../18f1d7de9bb4_add_freebie_model.py | 28 ++++++++++++++++++ lib/models.py | 12 ++++---- lib/seed.py | 28 ++++++++++++++++++ 4 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 lib/migrations/versions/18f1d7de9bb4_add_freebie_model.py diff --git a/lib/freebies.db b/lib/freebies.db index 91933571697071b6570c1fe895c41b7917fd6c9a..6518096d33a4c3f3e60c533feca0f4e8a68bb2eb 100644 GIT binary patch delta 199 zcmZoTz}Rqrae_1>=R_H2M$U~1Q{;IJEz%5A%u`Y=lafp}DSY9VKo;O-U|?Y4f5^c9 ziT~kdL4m9M+Wbr`4Dw9AnaM@@#rbI^?Av)5Sr{al-1GC(b5hyQK{UK$;Qz+|ZnL1l zBYp)oCT0du#fANe2fUj`a`lwX&dnT`$QRMM)r*fQ{;Ip(+m?W%`A None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### diff --git a/lib/models.py b/lib/models.py index 9b39110a6..344cf2e1f 100644 --- a/lib/models.py +++ b/lib/models.py @@ -30,17 +30,17 @@ def __repr__(self): class Freebie(Base): - __tablename__ = "freebies" + __tablename__ = 'freebies' id = Column(Integer, primary_key=True) - item_name = Column(String) + item_name = Column(String) value = Column(Integer) dev_id = Column(Integer, ForeignKey('devs.id')) company_id = Column(Integer, ForeignKey('companies.id')) - dev = relationship("Dev", backref=backref("freebies", cascade="all, delete-orphan")) - Company = relationship("Company", backref=backref("freebies", cascade="all, delete-orphan")) + dev = relationship("Dev", backref="freebies") + company = relationship("Company", backref="freebies") - def __ref__(self): - return f'' + def __repr__(self): + return f"" diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..debdaa3d8 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,31 @@ #!/usr/bin/env python3 # Script goes here! +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Company, Dev, Freebie + +engine = create_engine('sqlite:///freebies.db') +Session = sessionmaker(bind=engine) +session = Session() + +# Clear existing data (optional during development) +session.query(Freebie).delete() +session.query(Dev).delete() +session.query(Company).delete() + +# Seed data +google = Company(name="Google", founding_year=1998) +microsoft = Company(name="Microsoft", founding_year=1975) +alice = Dev(name="Alice") +bob = Dev(name="Bob") + + +f1 = Freebie(item_name="Sticker", value=1, company=google, dev=alice) +f2 = Freebie(item_name="T-shirt", value=10, company=microsoft, dev=alice) +f3 = Freebie(item_name="Mug", value=5, company=google, dev=bob) + +session.add_all([google, microsoft, alice, bob, f1, f2, f3]) +session.commit() + +print("Seed data created.") \ No newline at end of file From d0c1a2d5a8248018fb40feca3dbbb540fb49ad94 Mon Sep 17 00:00:00 2001 From: IsaacDev14 Date: Sun, 25 May 2025 21:48:35 +0300 Subject: [PATCH 04/10] Add computed relationships: Company.devs and Dev.companies --- lib/models.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/models.py b/lib/models.py index 344cf2e1f..8149048e2 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,6 +1,7 @@ from sqlalchemy import ForeignKey, Column, Integer, String, MetaData from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import joinedload convention = { "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", @@ -44,3 +45,16 @@ class Freebie(Base): def __repr__(self): return f"" + + @property + def devs(self): + return list({freebie.dev for freebie in self.freebies}) + + Company.devs = devs + + # Add this to Dev class + @property + def companies(self): + return list({freebie.company for freebie in self.freebies}) + + Dev.companies = companies \ No newline at end of file From b22df38805e067fe3f7cdc4d8ee36a3d3bab36ce Mon Sep 17 00:00:00 2001 From: IsaacDev14 Date: Sun, 25 May 2025 21:51:03 +0300 Subject: [PATCH 05/10] Fix: Move devs and companies properties to correct models and setup session in debug --- lib/debug.py | 6 +++++- lib/models.py | 51 +++++++++++---------------------------------------- 2 files changed, 16 insertions(+), 41 deletions(-) diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..c5965f436 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,13 @@ #!/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 if __name__ == '__main__': engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() + import ipdb; ipdb.set_trace() diff --git a/lib/models.py b/lib/models.py index 8149048e2..6ce1ed5e0 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,15 +1,3 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData -from sqlalchemy.orm import relationship, backref -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import joinedload - -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): __tablename__ = 'companies' @@ -17,44 +5,27 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + freebies = relationship("Freebie", backref="company") + + @property + def devs(self): + return list({freebie.dev for freebie in self.freebies}) + def __repr__(self): return f'' + class Dev(Base): __tablename__ = 'devs' id = Column(Integer(), primary_key=True) - name= Column(String()) - - def __repr__(self): - return f'' - - -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')) - - dev = relationship("Dev", backref="freebies") - company = relationship("Company", backref="freebies") - - def __repr__(self): - return f"" - - @property - def devs(self): - return list({freebie.dev for freebie in self.freebies}) + name = Column(String()) - Company.devs = devs + freebies = relationship("Freebie", backref="dev") - # Add this to Dev class @property def companies(self): return list({freebie.company for freebie in self.freebies}) - Dev.companies = companies \ No newline at end of file + def __repr__(self): + return f'' From 79dc64ed27fa29a1261a86ae24a6e1abf27dbde1 Mon Sep 17 00:00:00 2001 From: IsaacDev14 Date: Sun, 25 May 2025 21:53:55 +0300 Subject: [PATCH 06/10] Fix: Define Base in models.py and organize model relationships and properties --- lib/models.py | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/lib/models.py b/lib/models.py index 6ce1ed5e0..91dd2877b 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,3 +1,15 @@ +from sqlalchemy import Column, Integer, String, ForeignKey, MetaData +from sqlalchemy.orm import declarative_base, relationship + +# Naming convention for migrations +convention = { + "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", +} +metadata = MetaData(naming_convention=convention) + +# Base class for models +Base = declarative_base(metadata=metadata) + class Company(Base): __tablename__ = 'companies' @@ -12,7 +24,7 @@ def devs(self): return list({freebie.dev for freebie in self.freebies}) def __repr__(self): - return f'' + return f"" class Dev(Base): @@ -28,4 +40,18 @@ def companies(self): return list({freebie.company for freebie in self.freebies}) def __repr__(self): - return f'' + return f"" + + +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')) + + def __repr__(self): + return f"" From f13aecf194dc2350c6e4505ddd3da9f84e02238c Mon Sep 17 00:00:00 2001 From: IsaacDev14 Date: Sun, 25 May 2025 22:24:30 +0300 Subject: [PATCH 07/10] Implemented methods: Company.give_freebie, Company.oldest_company, Dev.received_one, Dev.give_away, and Freebie.print_details. --- lib/debug.py | 7 +++---- lib/models.py | 44 +++++++++++++++++++++++++++++++++++--------- lib/seed.py | 45 ++++++++++++++++++++++++++++++++++++++------- 3 files changed, 76 insertions(+), 20 deletions(-) diff --git a/lib/debug.py b/lib/debug.py index c5965f436..0d14e1333 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,8 +1,5 @@ -#!/usr/bin/env python3 - from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker - from models import Company, Dev, Freebie if __name__ == '__main__': @@ -10,4 +7,6 @@ Session = sessionmaker(bind=engine) session = Session() - import ipdb; ipdb.set_trace() + + + diff --git a/lib/models.py b/lib/models.py index 91dd2877b..0711d0451 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,48 +1,71 @@ from sqlalchemy import Column, Integer, String, ForeignKey, MetaData from sqlalchemy.orm import declarative_base, relationship -# Naming convention for migrations +# Naming convention for Alembic migrations convention = { "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", } metadata = MetaData(naming_convention=convention) -# Base class for models Base = declarative_base(metadata=metadata) 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) + founding_year = Column(Integer) freebies = relationship("Freebie", backref="company") @property def devs(self): + # Return unique devs who got freebies from this company return list({freebie.dev for freebie in self.freebies}) + def give_freebie(self, dev, item_name, value): + """Create a new freebie for a dev from this company""" + new_freebie = Freebie(item_name=item_name, value=value, company=self, dev=dev) + return new_freebie + + @classmethod + def oldest_company(cls, session): + """Return the company with the smallest founding_year""" + return session.query(cls).order_by(cls.founding_year).first() + 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) freebies = relationship("Freebie", backref="dev") @property def companies(self): + # Return unique companies who gave freebies to this dev return list({freebie.company for freebie in self.freebies}) + def received_one(self, item_name): + """Return True if dev has received a freebie with this item_name""" + return any(freebie.item_name == item_name for freebie in self.freebies) + + def give_away(self, new_dev, freebie): + """ + Transfer ownership of a freebie to another dev. + Returns True if successful, False if freebie does not belong to self. + """ + if freebie in self.freebies: + freebie.dev = new_dev + return True + return False + def __repr__(self): return f"" - class Freebie(Base): __tablename__ = 'freebies' @@ -53,5 +76,8 @@ class Freebie(Base): dev_id = Column(Integer, ForeignKey('devs.id')) company_id = Column(Integer, ForeignKey('companies.id')) + 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 debdaa3d8..d48ca2579 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,31 +1,62 @@ -#!/usr/bin/env python3 - -# Script goes here! from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from models import Company, Dev, Freebie +# Setup database connection and session engine = create_engine('sqlite:///freebies.db') Session = sessionmaker(bind=engine) session = Session() -# Clear existing data (optional during development) +# 1. Clear existing data (reset tables) session.query(Freebie).delete() session.query(Dev).delete() session.query(Company).delete() +session.commit() # Commit after deletions + +print("Cleared old data.") # For your reference -# Seed data +# 2. Create companies and devs google = Company(name="Google", founding_year=1998) microsoft = Company(name="Microsoft", founding_year=1975) alice = Dev(name="Alice") bob = Dev(name="Bob") +session.add_all([google, microsoft, alice, bob]) +session.commit() # Commit after initial data insertion + +print("Added companies and developers.") +# 3. Create freebies f1 = Freebie(item_name="Sticker", value=1, company=google, dev=alice) f2 = Freebie(item_name="T-shirt", value=10, company=microsoft, dev=alice) f3 = Freebie(item_name="Mug", value=5, company=google, dev=bob) -session.add_all([google, microsoft, alice, bob, f1, f2, f3]) +session.add_all([f1, f2, f3]) session.commit() -print("Seed data created.") \ No newline at end of file +print("Added freebies.") + +# 4. Use Company method: give_freebie +keychain = google.give_freebie(alice, "Keychain", 3) +session.add(keychain) +session.commit() +print(f"Company gave a freebie: {keychain}") + +# 5. Use class method: oldest_company +oldest = Company.oldest_company(session) +print(f"Oldest company: {oldest}") + +# 6. Use Dev method: received_one +print(f"Alice received Sticker? {alice.received_one('Sticker')}") +print(f"Bob received T-shirt? {bob.received_one('T-shirt')}") + +# 7. Use Dev method: give_away +first_freebie = alice.freebies[0] +print(f"Before giveaway: {first_freebie.print_details()}") +success = alice.give_away(bob, first_freebie) +if success: + session.commit() + print(f"Freebie given away successfully.") +else: + print("Giveaway failed.") +print(f"After giveaway: {first_freebie.print_details()}") From aa9a888e01983d3183a092671ad166874db3cd99 Mon Sep 17 00:00:00 2001 From: IsaacDev14 Date: Sun, 25 May 2025 22:42:54 +0300 Subject: [PATCH 08/10] Implement giveaway method and related Dev & Company functionality --- lib/freebies.db | Bin 24576 -> 24576 bytes ...9d9_create_companies_devs_and_freebies_.py | 28 ++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 lib/migrations/versions/3f9de8b849d9_create_companies_devs_and_freebies_.py diff --git a/lib/freebies.db b/lib/freebies.db index 6518096d33a4c3f3e60c533feca0f4e8a68bb2eb..c1f8ae7ab5d77fbea74eba3303c1d9adb1acba83 100644 GIT binary patch delta 153 zcmZoTz}Rqrae_1>|3n#QM*fWnQ{;J!(=1a`Es`uuEK@8uDSY8a6)<2_;OGCyz{0jZ3 delta 118 zcmZoTz}Rqrae_1>=R_H2M$U~1Q{;IJEz%5A%u`Y=lafp}DSY8a6)<2_;ALQ7VCKKf z!2gl|0srOAf&xeRb-9_@7=#%aIekmhS(*5m*cgCDGKT0DXJi(Ya53>R0tGlZIfF|w Ile1Hc0D65L9RL6T diff --git a/lib/migrations/versions/3f9de8b849d9_create_companies_devs_and_freebies_.py b/lib/migrations/versions/3f9de8b849d9_create_companies_devs_and_freebies_.py new file mode 100644 index 000000000..74b4c6145 --- /dev/null +++ b/lib/migrations/versions/3f9de8b849d9_create_companies_devs_and_freebies_.py @@ -0,0 +1,28 @@ +"""Create companies, devs, and freebies tables + +Revision ID: 3f9de8b849d9 +Revises: 18f1d7de9bb4 +Create Date: 2025-05-25 22:27:27.156435 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '3f9de8b849d9' +down_revision = '18f1d7de9bb4' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### From 7a35505fc39ae678e67c34036d512b202b517bd6 Mon Sep 17 00:00:00 2001 From: IsaacDev14 Date: Sun, 25 May 2025 22:47:45 +0300 Subject: [PATCH 09/10] docs: add README.md with project overview, setup, and usage instructions --- lib/migrations/README | 101 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 100 insertions(+), 1 deletion(-) diff --git a/lib/migrations/README b/lib/migrations/README index 98e4f9c44..2fcf60c2b 100644 --- a/lib/migrations/README +++ b/lib/migrations/README @@ -1 +1,100 @@ -Generic single-database configuration. \ No newline at end of file +# Freebie Tracker + +A simple Python project using SQLAlchemy and SQLite to track companies giving freebies to developers. +The project models companies, developers, and freebies, with functionality to manage freebie giveaways and relationships between entities. + +--- + +## Features + +- Models three entities: `Company`, `Dev` (Developer), and `Freebie`. +- Tracks freebies given by companies to developers. +- Supports giveaways (transferring freebies between developers). +- Query the oldest company by founding year. +- Relationships managed with SQLAlchemy ORM. +- Alembic migrations for database schema management. +- Seed script to populate the database with example data. + +--- + +## Requirements + +- Python 3.8+ +- SQLAlchemy `<2.0` (to avoid deprecation warnings) +- Alembic +- SQLite (used as the database engine) + +Install dependencies with: + +```bash +pip install sqlalchemy alembic +``` + +--- + +## Setup + +1. **Clone the repository:** + +```bash +git clone +cd python-p3-freebie-tracker/lib +``` + +2. **Create and apply migrations:** + +```bash +alembic upgrade head +``` + +3. **Run the seed script to populate the database with sample data:** + +```bash +python seed.py +``` + +--- + +## Usage + +After seeding the database, you can interact with the data using SQLAlchemy sessions and the methods defined in the models. + +### Example operations: + +- `Company.oldest_company(session)` + Get the company with the earliest founding year. + +- `company.give_freebie(dev, item_name, value)` + Company gives a new freebie to a developer. + +- `dev.received_one(item_name)` + Check if a developer received a particular freebie. + +- `dev.give_away(new_dev, freebie)` + Transfer a freebie from one developer to another. + +--- + +## Project Structure + +``` +lib/ +├── models.py # SQLAlchemy ORM models +├── seed.py # Script to clear and seed database with sample data +├── freebies.db # SQLite database file (generated after seeding) +└── migrations/ # Alembic migration scripts +``` + +--- + +## Notes + +- The project uses SQLite for simplicity and portability. +- SQLAlchemy 2.0 introduces breaking changes; this project uses SQLAlchemy `<2.0`. +- To silence deprecation warnings, pin the SQLAlchemy version in your requirements file. + +--- + +## Author + +Isaac Dev \ No newline at end of file From 5cd055f6d7bbc150b1057503072171fe89db2e73 Mon Sep 17 00:00:00 2001 From: IsaacDev14 Date: Sun, 25 May 2025 22:49:31 +0300 Subject: [PATCH 10/10] chore: add basic session setup script for manual DB interaction --- lib/debug.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/debug.py b/lib/debug.py index 0d14e1333..676f843ef 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -7,6 +7,9 @@ Session = sessionmaker(bind=engine) session = Session() - - - + # Example: Print all developers and their freebies + devs = session.query(Dev).all() + for dev in devs: + print(f"{dev.name} received:") + for freebie in dev.freebies: + print(f" - {freebie.item_name} (${freebie.value}) from {freebie.company.name}")