diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c96..c4c862d0c 100644 Binary files a/lib/freebies.db and b/lib/freebies.db differ diff --git a/lib/migrations/versions/3a473256e6ac_created_freebie_table.py b/lib/migrations/versions/3a473256e6ac_created_freebie_table.py new file mode 100644 index 000000000..b63c1db17 --- /dev/null +++ b/lib/migrations/versions/3a473256e6ac_created_freebie_table.py @@ -0,0 +1,33 @@ +"""Created Freebie Table + +Revision ID: 3a473256e6ac +Revises: 5f72c58bf48c +Create Date: 2023-04-13 12:56:43.701612 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '3a473256e6ac' +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.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/migrations/versions/7f0468678ed2_modified_tables_to_add_relationship.py b/lib/migrations/versions/7f0468678ed2_modified_tables_to_add_relationship.py new file mode 100644 index 000000000..2a750ae3d --- /dev/null +++ b/lib/migrations/versions/7f0468678ed2_modified_tables_to_add_relationship.py @@ -0,0 +1,38 @@ +"""modified tables to add relationship + +Revision ID: 7f0468678ed2 +Revises: 3a473256e6ac +Create Date: 2023-04-13 13:43:07.954324 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '7f0468678ed2' +down_revision = '3a473256e6ac' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('freebies', schema=None) as batch_op: + batch_op.add_column(sa.Column('company_id', sa.Integer(), nullable=True)) + batch_op.add_column(sa.Column('dev_id', sa.Integer(), nullable=True)) + batch_op.create_foreign_key(batch_op.f('fk_freebies_company_id_companies'), 'companies', ['company_id'], ['id']) + batch_op.create_foreign_key(batch_op.f('fk_freebies_dev_id_devs'), 'devs', ['dev_id'], ['id']) + + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('freebies', schema=None) as batch_op: + batch_op.drop_constraint(batch_op.f('fk_freebies_dev_id_devs'), type_='foreignkey') + batch_op.drop_constraint(batch_op.f('fk_freebies_company_id_companies'), type_='foreignkey') + batch_op.drop_column('dev_id') + batch_op.drop_column('company_id') + + # ### end Alembic commands ### diff --git a/lib/models.py b/lib/models.py index 2681bee5a..a4740e210 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,5 +1,6 @@ from sqlalchemy import ForeignKey, Column, Integer, String, MetaData from sqlalchemy.orm import relationship, backref +from sqlalchemy.ext.associationproxy import association_proxy from sqlalchemy.ext.declarative import declarative_base convention = { @@ -16,6 +17,10 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + freebies = relationship('Freebies', backref=backref('company')) + devs = association_proxy('freebies', 'dev', + creator=lambda us: Freebies(dev=us)) + def __repr__(self): return f'' @@ -25,5 +30,22 @@ class Dev(Base): id = Column(Integer(), primary_key=True) name= Column(String()) + freebies = relationship('Freebies', backref=backref('dev')) + companies = association_proxy('freebies', 'company', + creator=lambda us: Freebies(company=us)) + def __repr__(self): return f'' + +class Freebies(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 __repr__(self): + return f'' diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..830bf5591 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,39 @@ #!/usr/bin/env python3 -# Script goes here! +from random import choice as rc + +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +from models import Dev, Company, Freebies + +engine = create_engine('sqlite:///seed_db.db') +Session = sessionmaker(bind=engine) +session = Session() + +def delete_records(): + session.query(Dev).delete() + session.query(Company).delete() + session.query(Freebies).delete() + session.commit() + +def create_records(): + companies = [Company() for i in range(500)] + devs = [Dev() for i in range(500)] + freebies = [Freebies() for i in range(1000)] + session.add_all(companies + devs + freebies) + session.commit() + return companies, devs, freebies + +def relate_one_to_many(devs, companies, freebies): + for freebie in freebies: + freebie.dev = rc(devs) + freebie.company = rc(companies) + + session.add_all(freebies) + session.commit() + +if __name__ == '__main__': + delete_records() + devs, companies, freebies = create_records() + relate_one_to_many(devs, companies, freebies) diff --git a/lib/seed_db.db b/lib/seed_db.db new file mode 100644 index 000000000..e69de29bb