From 845dbda37eaa15fc5ab0ea6b599b52c05fd81a98 Mon Sep 17 00:00:00 2001 From: Michael Tanaka Date: Thu, 10 Aug 2023 22:19:53 -0700 Subject: [PATCH] Lab Completed --- lib/debug.py | 15 +-- lib/freebies.db | Bin 20480 -> 28672 bytes .../01d29b0672ca_updated_company_table.py | 34 ++++++ .../2a77a1146fea_updated_company_table.py | 28 +++++ .../3243e4519884_create_freebie_table.py | 37 +++++++ .../73640f588b9d_updated_company_table.py | 34 ++++++ .../8848b7559c2d_updated_company_table.py | 28 +++++ .../ae4d2678b12c_updated_company_table.py | 28 +++++ .../c2d71ca82314_updated_company_table.py | 28 +++++ lib/models.py | 71 ++++++++++++- lib/seed.py | 100 +++++++++++++++++- 11 files changed, 390 insertions(+), 13 deletions(-) create mode 100644 lib/migrations/versions/01d29b0672ca_updated_company_table.py create mode 100644 lib/migrations/versions/2a77a1146fea_updated_company_table.py create mode 100644 lib/migrations/versions/3243e4519884_create_freebie_table.py create mode 100644 lib/migrations/versions/73640f588b9d_updated_company_table.py create mode 100644 lib/migrations/versions/8848b7559c2d_updated_company_table.py create mode 100644 lib/migrations/versions/ae4d2678b12c_updated_company_table.py create mode 100644 lib/migrations/versions/c2d71ca82314_updated_company_table.py diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..adf87b1fb 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,12 @@ -#!/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 +if __name__ == "__main__": + engine = create_engine("sqlite:///freebies.db") + Session = sessionmaker(bind=engine) + session = Session() + import ipdb -if __name__ == '__main__': - engine = create_engine('sqlite:///freebies.db') - import ipdb; ipdb.set_trace() + ipdb.set_trace() diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c963e832db481e7a7493e3029e691ac4dc..419146ba06c0137748962b626b7b3ef735f3ce16 100644 GIT binary patch literal 28672 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 Y(DofHsl@`Sz)adPGcMYJKl)erFQNRcUjP6A delta 247 zcmZp8z}T>Wae|Z(11kdq7y~IVV4kRBBnA}GiVqRuyF`U7IVi-ht@*5sGpm~~;y?F#S tbMwCx;5JP&H%d0ONJ=xY*!*AqE58tuKr%1LGXk3#4Sw-Ya$sSCG6DQuLAd|` diff --git a/lib/migrations/versions/01d29b0672ca_updated_company_table.py b/lib/migrations/versions/01d29b0672ca_updated_company_table.py new file mode 100644 index 000000000..1cf090662 --- /dev/null +++ b/lib/migrations/versions/01d29b0672ca_updated_company_table.py @@ -0,0 +1,34 @@ +"""Updated Company Table + +Revision ID: 01d29b0672ca +Revises: 73640f588b9d +Create Date: 2023-08-09 07:16:19.265786 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '01d29b0672ca' +down_revision = '73640f588b9d' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('companies', 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_companies_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('companies', schema=None) as batch_op: + batch_op.drop_constraint(batch_op.f('fk_companies_dev_id_devs'), type_='foreignkey') + batch_op.drop_column('dev_id') + + # ### end Alembic commands ### diff --git a/lib/migrations/versions/2a77a1146fea_updated_company_table.py b/lib/migrations/versions/2a77a1146fea_updated_company_table.py new file mode 100644 index 000000000..c472db503 --- /dev/null +++ b/lib/migrations/versions/2a77a1146fea_updated_company_table.py @@ -0,0 +1,28 @@ +"""Updated Company Table + +Revision ID: 2a77a1146fea +Revises: 8848b7559c2d +Create Date: 2023-08-09 06:46:55.212804 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '2a77a1146fea' +down_revision = '8848b7559c2d' +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 ### diff --git a/lib/migrations/versions/3243e4519884_create_freebie_table.py b/lib/migrations/versions/3243e4519884_create_freebie_table.py new file mode 100644 index 000000000..706ce5173 --- /dev/null +++ b/lib/migrations/versions/3243e4519884_create_freebie_table.py @@ -0,0 +1,37 @@ +"""Create Freebie Table + +Revision ID: 3243e4519884 +Revises: 5f72c58bf48c +Create Date: 2023-08-09 06:08:25.493385 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '3243e4519884' +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 ### diff --git a/lib/migrations/versions/73640f588b9d_updated_company_table.py b/lib/migrations/versions/73640f588b9d_updated_company_table.py new file mode 100644 index 000000000..69bbdb161 --- /dev/null +++ b/lib/migrations/versions/73640f588b9d_updated_company_table.py @@ -0,0 +1,34 @@ +"""Updated Company Table + +Revision ID: 73640f588b9d +Revises: 2a77a1146fea +Create Date: 2023-08-09 06:54:21.920975 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '73640f588b9d' +down_revision = '2a77a1146fea' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('devs', schema=None) as batch_op: + batch_op.add_column(sa.Column('company_id', sa.Integer(), nullable=True)) + batch_op.create_foreign_key(batch_op.f('fk_devs_company_id_companies'), 'companies', ['company_id'], ['id']) + + # ### 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.drop_constraint(batch_op.f('fk_devs_company_id_companies'), type_='foreignkey') + batch_op.drop_column('company_id') + + # ### end Alembic commands ### diff --git a/lib/migrations/versions/8848b7559c2d_updated_company_table.py b/lib/migrations/versions/8848b7559c2d_updated_company_table.py new file mode 100644 index 000000000..c757e688f --- /dev/null +++ b/lib/migrations/versions/8848b7559c2d_updated_company_table.py @@ -0,0 +1,28 @@ +"""Updated Company Table + +Revision ID: 8848b7559c2d +Revises: 3243e4519884 +Create Date: 2023-08-09 06:43:04.564952 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '8848b7559c2d' +down_revision = '3243e4519884' +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 ### diff --git a/lib/migrations/versions/ae4d2678b12c_updated_company_table.py b/lib/migrations/versions/ae4d2678b12c_updated_company_table.py new file mode 100644 index 000000000..b61a9a969 --- /dev/null +++ b/lib/migrations/versions/ae4d2678b12c_updated_company_table.py @@ -0,0 +1,28 @@ +"""Updated Company Table + +Revision ID: ae4d2678b12c +Revises: c2d71ca82314 +Create Date: 2023-08-09 07:27:55.701875 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'ae4d2678b12c' +down_revision = 'c2d71ca82314' +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 ### diff --git a/lib/migrations/versions/c2d71ca82314_updated_company_table.py b/lib/migrations/versions/c2d71ca82314_updated_company_table.py new file mode 100644 index 000000000..ff6fe72f5 --- /dev/null +++ b/lib/migrations/versions/c2d71ca82314_updated_company_table.py @@ -0,0 +1,28 @@ +"""Updated Company Table + +Revision ID: c2d71ca82314 +Revises: 01d29b0672ca +Create Date: 2023-08-09 07:22:17.469239 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'c2d71ca82314' +down_revision = '01d29b0672ca' +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 ### diff --git a/lib/models.py b/lib/models.py index 2681bee5a..706025f0e 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,6 +1,14 @@ from sqlalchemy import ForeignKey, Column, Integer, String, MetaData from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.associationproxy import association_proxy +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from sqlalchemy import desc + +engine = create_engine("sqlite:///freebies.db") +Session = sessionmaker(bind=engine) +session = Session() convention = { "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", @@ -9,21 +17,74 @@ Base = declarative_base(metadata=metadata) + class Company(Base): - __tablename__ = 'companies' + __tablename__ = "companies" id = Column(Integer(), primary_key=True) name = Column(String()) founding_year = Column(Integer()) + dev_id = Column(Integer(), ForeignKey("devs.id")) + + freebie = relationship("Freebie", backref=backref("company")) + dev = association_proxy("freebie", "dev") + + def give_freebie(self, dev, item_name, value): + new_freebie = Freebie(item_name=item_name, value=value) + new_freebie.company = self + new_freebie.dev = dev + session.commit() + + @classmethod + def oldest_company(cls): + return session.query(cls.name).order_by(cls.founding_year).first() def __repr__(self): - return f'' + return f"" + class Dev(Base): - __tablename__ = 'devs' + __tablename__ = "devs" id = Column(Integer(), primary_key=True) - name= Column(String()) + name = Column(String()) + + company_id = Column(Integer(), ForeignKey("companies.id")) + + freebie = relationship("Freebie", backref=backref("dev")) + companies = association_proxy("freebie", "company") + + def received_one(self, item_name): + dev_items = [self.item_name for self in self.freebie] + return item_name in dev_items + + def give_away(self, dev, freebie): + if freebie in self.freebie: + self.freebie.remove(freebie) + dev.freebie.append(freebie) + session.commit() + else: + print(f"{self.name} doesn't own a {freebie.item_name} to give away.") 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 print_details(self): + return f"{self.dev.name} owns a {self.item_name} from {self.company.name}" + + +freebie = session.query(Freebie).all()[36] +dev = session.query(Dev).all()[0] +dev2 = session.query(Dev).all()[1] +dev.give_away(dev2, freebie) diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..1cc893e24 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,99 @@ -#!/usr/bin/env python3 +from faker import Faker +import random -# Script goes here! +from random import choice as rc + +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() + +fake = Faker() +comp_name = [ + "SAS", + "Amazon", + "FlatIron", + "Google", + "Apple", + "Accenture", + "Home Depot", + "Wagner LLC", + "Campos PLC", + "Paramount", +] +item = [ + "coffee cup", + "t-shirt", + "phone case", + "pen", + "charger", + "keyboard", + "cup holder", + "eyeglass cleaner", + "mouse pad", + "headphones", +] + + +def delete_records(): + session.query(Company).delete() + session.query(Dev).delete() + session.query(Freebie).delete() + session.commit() + + +def create_companies(): + companies = [] + for i in range(10): + company = Company(name=random.choice(comp_name), founding_year=fake.year()) + session.add(company) + session.commit() + companies.append(company) + return companies + + +def create_devs(): + devs = [] + for i in range(50): + dev = Dev(name=fake.name()) + session.add(dev) + session.commit() + devs.append(dev) + return devs + + +def create_freebies(): + freebies = [] + for i in range(99): + freebie = Freebie(item_name=random.choice(item), value=random.randint(0, 60)) + session.add(freebie) + session.commit() + freebies.append(freebie) + return freebies + + +def relate_one_to_many(companies, devs, freebies): + for freebie in freebies: + freebie.dev = rc(devs) + freebie.company = rc(companies) + + for dev in devs: + dev.company = rc(companies) + for company in companies: + company.dev = rc(devs) + + session.add_all(freebies) + session.commit() + return companies, devs, freebies + + +if __name__ == "__main__": + delete_records() + companies = create_companies() + devs = create_devs() + freebies = create_freebies() + companies, devs, freebies = relate_one_to_many(companies, devs, freebies)