From f55403fc6cfe025a74de3fd3ba0a4b233e8df4a0 Mon Sep 17 00:00:00 2001 From: ussenuk Date: Tue, 13 Feb 2024 13:53:40 +0300 Subject: [PATCH] deep undersatanding of the sqlAchemy logic and seeding --- freebies.db | 0 lib/debug.py | 87 +++++++++++++++++- lib/freebies.db | Bin 20480 -> 32768 bytes lib/freebies.db-journal | Bin 0 -> 4616 bytes ...fa35c_add_company_dev_association_table.py | 34 +++++++ .../62e7ec2d7f28_add_freebie_model.py | 37 ++++++++ lib/models.py | 58 +++++++++++- lib/seed.py | 75 +++++++++++++++ 8 files changed, 289 insertions(+), 2 deletions(-) create mode 100644 freebies.db create mode 100644 lib/freebies.db-journal create mode 100644 lib/migrations/versions/2877be2fa35c_add_company_dev_association_table.py create mode 100644 lib/migrations/versions/62e7ec2d7f28_add_freebie_model.py diff --git a/freebies.db b/freebies.db new file mode 100644 index 000000000..e69de29bb diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..360541429 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,94 @@ #!/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() + + + # # Query all companies + # companies = session.query(Company).all() + + # # For each company, print its name and the names of its devs + # for company in companies: + # print(f'Company: {company.name}') + # print('Devs:') + # for dev in company.devs: + # print(f'- {dev.name}') + + # # Query all devs + # devs = session.query(Dev).all() + + # # For each dev, print its name and the names of its companies + # for dev in devs: + # print(f'Dev: {dev.name}') + # print('Companies:') + # for company in dev.companies: + # print(f'- {company.name}') + + + # # For a particular dev what the freebies collected from different companies + # dev = session.query(Dev).filter_by(name='Matthew Grant').first() + + # if dev is not None: + # print(dev.freebies) + # else: + # print("Developer didn't collect freebies.") + + + # # Query all freebies + # freebies = session.query(Freebie).all() + + # for freebie in freebies: + # try: + # print(freebie.print_details()) + # except Exception as e: + # print(f"Error printing details for freebie with id {freebie.id}: {e}") + + # # Query all companies + # companies = session.query(Company).all() + + # for company in companies: + # try: + # # Test oldest_company method + # oldest_company = Company.oldest_company(session) + # print(f"Oldest company: {oldest_company}") + # except Exception as e: + # print(f"Error finding oldest company for company with id {company.id}: {e}") + + # # Query all devs + # devs = session.query(Dev).all() + + + + # Query all devs and freebies + devs = session.query(Dev).all() + freebies = session.query(Freebie).all() + + # Test give_away method for each dev and freebie + for dev in devs: + for freebie in freebies: + try: + # Use a known dev for testing + new_dev = devs[0] # replace with a valid Dev instance + result = dev.give_away(new_dev, freebie) + print(f"Dev {dev.name} gave away {freebie.item_name} to {new_dev.name}: {result}") + except Exception as e: + print(f"Error giving away freebie with id {freebie.id} from dev with id {dev.id} to dev with id {new_dev.id}: {e}") + + # print(dev.received_one('Freebie Name')) + # other_dev = Dev(name='Other Dev') + # session.add(other_dev) + # session.commit() + # print(dev.give_away(other_dev, freebie)) + + # print(Company.oldest_company(session)) + + + import ipdb; ipdb.set_trace() diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c963e832db481e7a7493e3029e691ac4dc..bd808980af1d88e3ee09931e7a05b42c581f2ff4 100644 GIT binary patch literal 32768 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 delta 120 zcmZo@U}{*vI6+#Fm4Sf)gkgYrqK>gBD}!FVEHD2L1{OXk27X@toqY9tQkw+@mho;Eejy}*WL}U_0zlRG`6o`0W<%uy0FKfcXaE2J diff --git a/lib/freebies.db-journal b/lib/freebies.db-journal new file mode 100644 index 0000000000000000000000000000000000000000..c887f5ac26eebe447c8bac3244eb1336c6998692 GIT binary patch literal 4616 zcmeI0J#W)M7{@QRbM`s+V(03-kcOmfk~SfIaVmjm5io#YD5w%3Ap|N3bxD+{P7@2n zzycBrUjPt0149?aE{w3SFfnvt?${YFjnvr5HvoIFpXZ+YKhOVnHyMD@6TABIp@=j9 zB=Isv3*pzlOaKz$u7>vjJ7PcCSGLbSvbXFR+hO zF5RNH>18@k6BLqTa!7uV1F}y(kk@37JR c~T-Kk?}D;#NY52{0YCuZ$y*u2?>M* zLINRykU&TvBoGn^34{dxF9N&`Z3wa=x$AmP!*$znRK+V0 zaFJ@%pF*@0TOLFx(sgz>GJI)V;*MJ6i^Jqjr`~Vow_E-8rKoLHAt(xw=XKBN&&FkqO8%hkITJif~EZX>}ZN5 z{fTv%8;O8@4&jtFiSF90ITiF)f@#M6TAO+n$4?LLf?B4gZx&l&rV&)QC`kqjG_S}B zg9b7+v|x}xCaM=G_6cvGB#({X5KAdi-B*-B8b-s}#D%@3AgcLRxhivY{A}0c3WI)s zkL8jX4LaCTxS<55TUBgR4i>Ge)uaSLSzNJBz3aK%eBWz5X*<1?6g4BkS|laKf1lrf E0c;4 None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('company_devs', + sa.Column('company_id', sa.Integer(), nullable=False), + sa.Column('dev_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['company_id'], ['companies.id'], name=op.f('fk_company_devs_company_id_companies')), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], name=op.f('fk_company_devs_dev_id_devs')), + sa.PrimaryKeyConstraint('company_id', 'dev_id') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('company_devs') + # ### end Alembic commands ### diff --git a/lib/migrations/versions/62e7ec2d7f28_add_freebie_model.py b/lib/migrations/versions/62e7ec2d7f28_add_freebie_model.py new file mode 100644 index 000000000..3eb56c619 --- /dev/null +++ b/lib/migrations/versions/62e7ec2d7f28_add_freebie_model.py @@ -0,0 +1,37 @@ +"""Add Freebie model + +Revision ID: 62e7ec2d7f28 +Revises: 5f72c58bf48c +Create Date: 2024-02-12 23:10:38.211872 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '62e7ec2d7f28' +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('company_id', sa.Integer(), nullable=True), + sa.Column('dev_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 ### diff --git a/lib/models.py b/lib/models.py index 2681bee5a..1ecc3cb73 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,4 +1,4 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData +from sqlalchemy import Table, ForeignKey, Column, Integer, String, MetaData from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base @@ -9,6 +9,14 @@ Base = declarative_base(metadata=metadata) +company_dev = Table( + 'company_devs', + Base.metadata, + Column('company_id', ForeignKey('companies.id'), primary_key=True), + Column('dev_id', ForeignKey('devs.id'), primary_key=True), + extend_existing=True, +) + class Company(Base): __tablename__ = 'companies' @@ -16,8 +24,43 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + freebies = relationship('Freebie', backref=backref('company')) + + devs = relationship('Dev', secondary=company_dev, back_populates='companies') + + + def give_freebie(self, dev, item_name, value): + freebie = Freebie(item_name=item_name, value=value, dev_id=dev.id, company_id=self.id) + return freebie + + @classmethod + def oldest_company(cls, session): + return session.query(cls).order_by(cls.founding_year).first() + def __repr__(self): return f'' + + + +class Freebie(Base): + __tablename__ = 'freebies' + + id = Column(Integer(), primary_key=True) + item_name = Column(String()) + value= Column(Integer()) + + company_id = Column(Integer(), ForeignKey('companies.id')) + + dev_id = Column(Integer(), ForeignKey('devs.id')) + + def print_details(self): + return f'{self.dev.name} owns a {self.item_name} from {self.company.name}' + + def __repr__(self): + return f'Freebie(id={self.id},' + \ + f'item_name={self.item_name}, ' + \ + f'company_id={self.company_id})' + class Dev(Base): __tablename__ = 'devs' @@ -25,5 +68,18 @@ class Dev(Base): id = Column(Integer(), primary_key=True) name= Column(String()) + freebies = relationship('Freebie', backref=backref('dev')) + + companies = relationship ('Company', secondary = company_dev, back_populates = 'devs') + + def received_one(self, item_name): + return any(freebie.item_name == item_name for freebie in self.freebies) + + def give_away(self, dev, freebie): + if freebie in self.freebies: + freebie.dev_id = dev.id + return True + return False + def __repr__(self): return f'' diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..3f03044c4 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,78 @@ #!/usr/bin/env python3 # Script goes here! +from faker import Faker +import random + +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +from models import Company, Dev, Freebie + +if __name__ == '__main__': + engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() + + session.query(Company).delete() + session.query(Dev).delete() + session.query(Freebie).delete() + + fake = Faker() + + item_names = ['hoodie','laptop sticker', + 'flask', 'water bottle', 'T-shirt', + 'key holder', 'pen','bag','notebook', + 'flash disk'] + + devs = [] + for i in range(50): + dev = Dev( + name=fake.name(), + ) + + session.add(dev) + session.commit() + + devs.append(dev) + + companies = [] + for i in range(10): + company = Company( + name = fake.name(), + founding_year=fake.year() + ) + # add and commit individually to get IDs back + + session.add(company) + session.commit() + + companies.append(company) + + + freebies = [] + for i in range(50): + dev = random.choice(devs) + company = random.choice(companies) + + # Create association between dev and company + dev.companies.append(company) + company.devs.append(dev) + + freebie = Freebie( + item_name =random.choice(item_names), + value = random.randint(5,100), + company_id=company.id, + dev_id=dev.id, + ) + + + session.add(freebie) + session.commit() + + freebies.append(freebie) + + session.close() + + + \ No newline at end of file