Skip to content

Commit be470d0

Browse files
committed
completed
1 parent 0a2a676 commit be470d0

5 files changed

Lines changed: 149 additions & 3 deletions

File tree

lib/debug.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
#!/usr/bin/env python3
22

33
from sqlalchemy import create_engine
4+
from sqlalchemy.orm import sessionmaker
45

5-
from models import Company, Dev
6+
7+
from models import Company, Dev, Freebie
68

79
if __name__ == '__main__':
810
engine = create_engine('sqlite:///freebies.db')
11+
Session = sessionmaker(bind=engine)
12+
session = Session()
913
import ipdb; ipdb.set_trace()

lib/freebies.db

12 KB
Binary file not shown.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
"""Add Freebie Model
2+
3+
Revision ID: cbfc11270a30
4+
Revises: 5f72c58bf48c
5+
Create Date: 2023-12-10 17:19:02.371520
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
11+
12+
# revision identifiers, used by Alembic.
13+
revision = 'cbfc11270a30'
14+
down_revision = '5f72c58bf48c'
15+
branch_labels = None
16+
depends_on = None
17+
18+
19+
def upgrade() -> None:
20+
# ### commands auto generated by Alembic - please adjust! ###
21+
op.create_table('company_devs',
22+
sa.Column('company_id', sa.Integer(), nullable=False),
23+
sa.Column('dev_id', sa.Integer(), nullable=False),
24+
sa.ForeignKeyConstraint(['company_id'], ['companies.id'], name=op.f('fk_company_devs_company_id_companies')),
25+
sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], name=op.f('fk_company_devs_dev_id_devs')),
26+
sa.PrimaryKeyConstraint('company_id', 'dev_id')
27+
)
28+
op.create_table('freebies',
29+
sa.Column('id', sa.Integer(), nullable=False),
30+
sa.Column('item_name', sa.String(), nullable=True),
31+
sa.Column('value', sa.Integer(), nullable=True),
32+
sa.Column('company_id', sa.Integer(), nullable=True),
33+
sa.Column('dev_id', sa.Integer(), nullable=True),
34+
sa.ForeignKeyConstraint(['company_id'], ['companies.id'], name=op.f('fk_freebies_company_id_companies')),
35+
sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], name=op.f('fk_freebies_dev_id_devs')),
36+
sa.PrimaryKeyConstraint('id')
37+
)
38+
# ### end Alembic commands ###
39+
40+
41+
def downgrade() -> None:
42+
# ### commands auto generated by Alembic - please adjust! ###
43+
op.drop_table('freebies')
44+
op.drop_table('company_devs')
45+
# ### end Alembic commands ###

lib/models.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from sqlalchemy import ForeignKey, Column, Integer, String, MetaData
1+
from sqlalchemy import ForeignKey, Table, Column, Integer, String, MetaData
22
from sqlalchemy.orm import relationship, backref
33
from sqlalchemy.ext.declarative import declarative_base
44

@@ -9,21 +9,51 @@
99

1010
Base = declarative_base(metadata=metadata)
1111

12+
company_dev = Table(
13+
'company_devs',
14+
Base.metadata,
15+
Column('company_id', ForeignKey('companies.id'), primary_key=True),
16+
Column('dev_id', ForeignKey('devs.id'), primary_key=True),
17+
extend_existing=True,
18+
)
19+
20+
1221
class Company(Base):
1322
__tablename__ = 'companies'
1423

1524
id = Column(Integer(), primary_key=True)
1625
name = Column(String())
1726
founding_year = Column(Integer())
1827

28+
freebies = relationship('Freebie', backref=backref('company'))
29+
devs = relationship('Dev', secondary=company_dev, back_populates='companies')
30+
31+
1932
def __repr__(self):
2033
return f'<Company {self.name}>'
34+
35+
36+
class Freebie(Base):
37+
__tablename__ = 'freebies'
38+
39+
id = Column(Integer(), primary_key=True)
40+
item_name = Column(String())
41+
value = Column(Integer())
42+
43+
company_id = Column(Integer(), ForeignKey('companies.id'))
44+
dev_id = Column(Integer(), ForeignKey('devs.id'))
45+
2146

2247
class Dev(Base):
2348
__tablename__ = 'devs'
2449

2550
id = Column(Integer(), primary_key=True)
2651
name= Column(String())
2752

53+
freebies = relationship('Freebie', backref=backref('dev'))
54+
companies = relationship('Company', secondary=company_dev, back_populates='devs')
55+
56+
2857
def __repr__(self):
2958
return f'<Dev {self.name}>'
59+

lib/seed.py

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,70 @@
11
#!/usr/bin/env python3
22

3-
# Script goes here!
3+
from faker import Faker
4+
import random
5+
6+
from sqlalchemy import create_engine
7+
from sqlalchemy.orm import sessionmaker
8+
9+
from models import Company, Dev, Freebie
10+
11+
if __name__ == '__main__':
12+
engine = create_engine('sqlite:///freebies.db')
13+
Session = sessionmaker(bind=engine)
14+
session = Session()
15+
16+
session.query(Company).delete()
17+
session.query(Dev).delete()
18+
session.query(Freebie).delete()
19+
20+
fake = Faker()
21+
22+
items = ['T-shirt','hoodie', 'usb drive',
23+
'charger', 'notebooks', 'caps']
24+
companies = []
25+
for i in range(50):
26+
company = Company(
27+
name=fake.company(),
28+
founding_year= fake.year(),
29+
)
30+
31+
# add and commit individually to get IDs back
32+
session.add(company)
33+
session.commit()
34+
35+
companies.append(company)
36+
37+
38+
devs = []
39+
for i in range(25):
40+
dev = Dev(
41+
name=fake.name(),
42+
)
43+
44+
session.add(dev)
45+
session.commit()
46+
47+
devs.append(dev)
48+
49+
50+
freebies = []
51+
for company in companies:
52+
for i in range(random.randint(1,5)):
53+
dev = random.choice(devs)
54+
if company not in dev.companies:
55+
dev.companies.append(company)
56+
session.add(dev)
57+
session.commit()
58+
59+
freebie = Freebie(
60+
item_name=random.choice(items),
61+
value=random.randint(0, 10),
62+
company_id=company.id,
63+
dev_id=dev.id,
64+
)
65+
66+
freebies.append(freebie)
67+
68+
session.bulk_save_objects(freebies)
69+
session.commit()
70+
session.close()

0 commit comments

Comments
 (0)