diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c96..c151eaa16 100644 Binary files a/lib/freebies.db and b/lib/freebies.db differ diff --git a/lib/migrations/versions/712044114a04_add_company_dev_model.py b/lib/migrations/versions/712044114a04_add_company_dev_model.py new file mode 100644 index 000000000..94f4f0200 --- /dev/null +++ b/lib/migrations/versions/712044114a04_add_company_dev_model.py @@ -0,0 +1,34 @@ +"""Add company_dev model + +Revision ID: 712044114a04 +Revises: cc50d79cf00b +Create Date: 2024-01-07 12:14:53.457383 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '712044114a04' +down_revision = 'cc50d79cf00b' +branch_labels = None +depends_on = None + + +def upgrade() -> 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/8b8cc2e88779_add_freebie_model.py b/lib/migrations/versions/8b8cc2e88779_add_freebie_model.py new file mode 100644 index 000000000..12f7c17cc --- /dev/null +++ b/lib/migrations/versions/8b8cc2e88779_add_freebie_model.py @@ -0,0 +1,35 @@ +"""Add Freebie model + +Revision ID: 8b8cc2e88779 +Revises: 5f72c58bf48c +Create Date: 2024-01-07 07:52:12.904907 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '8b8cc2e88779' +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('name', sa.String(), nullable=True), + sa.Column('value', 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.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/cc50d79cf00b_create_dev_freebie_relationship.py b/lib/migrations/versions/cc50d79cf00b_create_dev_freebie_relationship.py new file mode 100644 index 000000000..f82b30590 --- /dev/null +++ b/lib/migrations/versions/cc50d79cf00b_create_dev_freebie_relationship.py @@ -0,0 +1,34 @@ +"""Create dev-freebie relationship + +Revision ID: cc50d79cf00b +Revises: 8b8cc2e88779 +Create Date: 2024-01-07 11:15:40.538800 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'cc50d79cf00b' +down_revision = '8b8cc2e88779' +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('dev_id', sa.Integer(), nullable=True)) + 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_column('dev_id') + + # ### end Alembic commands ### diff --git a/lib/models.py b/lib/models.py index 2681bee5a..5b83c0081 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,4 +1,4 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData +from sqlalchemy import ForeignKey, Column, Integer, String, MetaData, Table, DateTime from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base @@ -9,6 +9,15 @@ Base = declarative_base(metadata=metadata) +# company-freebie (many-many) relationship +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,6 +25,10 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + # establishing company-freebie (one-to-many) relationship + freebies = relationship('Freebie', backref=backref('companies')) + devs = relationship('Dev', secondary=company_dev, back_populates='companies') + def __repr__(self): return f'' @@ -25,5 +38,27 @@ class Dev(Base): id = Column(Integer(), primary_key=True) name= Column(String()) + # establishing dev-freebie (one-to-many) relationship + freebies = relationship('Freebie', backref=backref('devs')) + companies = relationship('Company', secondary=company_dev, back_populates='devs') + def __repr__(self): return f'' + +class Freebie(Base): + __tablename__= 'freebies' + + id = Column(Integer(), primary_key=True) + name = Column(String()) + value = Column(Integer()) + # creating foreign foreign keys for relationships (company-freebie) + company_id = Column(Integer(), ForeignKey('companies.id')) + #creating foreign foreign keys for relationships (dev-freebie) + dev_id = Column(Integer(), ForeignKey('devs.id')) + + + def __repr__(self) -> str: + return f'Freebie(id={self.id}, ' + \ + f'name={self.name}, ' + \ + f'value={self.value})' + diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..0fe399f62 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,69 @@ #!/usr/bin/env python3 -# Script goes here! +from faker import Faker +from datetime import datetime +import random + +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +from models import Company, Freebie, Dev, company_dev + +if __name__== '__main__': + engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() + + session.query(Company).delete() + session.query(Freebie).delete() + session.query(Dev).delete() + session.query(company_dev).delete() + + fake = Faker() + + companies = [] + for i in range(50): + company = Company( + name=fake.unique.name(), + founding_year= fake.date_between_dates(date_start=datetime(2002, 1, 1), date_end=datetime(2015, 12, 31)).year + ) + + # add and commit individually to get IDs back + session.add(company) + session.commit() + + companies.append(company) + + + devs = [] + for i in range(25): + dev = Dev( + name = fake.name(), + ) + + session.add(dev) + session.commit() + + devs.append(dev) + + freebies = [] + for company in companies: + for i in range(random.randint(1,5)): + dev = random.choice(devs) + if company not in dev.companies: + dev.companies.append(company) + session.add(dev) + session.commit() + + freebie = Freebie( + name = fake.name(), + value = random.randint(100, 1000), + company_id = company.id, + dev_id = dev.id, + ) + + freebies.append(freebie) + + session.bulk_save_objects(freebies) + session.commit() + session.close()