From 5da8ed7a1359b357c74117ce59db4a7689f30d86 Mon Sep 17 00:00:00 2001 From: Kennedy Ouma Odero Date: Wed, 28 May 2025 13:08:15 +0300 Subject: [PATCH 1/3] feat: re initialized alembic migrations --- lib/alembic.ini => alembic.ini | 0 lib/debug.py => debug.py | 0 lib/freebies.db => freebies.db | Bin 20480 -> 20480 bytes .../versions/7a71dbf71c64_create_db.py | 24 ------------------ {lib/migrations => migrations}/README | 0 {lib/migrations => migrations}/env.py | 5 ++-- {lib/migrations => migrations}/script.py.mako | 0 .../864bb5434c61_initial_migration.py | 12 ++++----- 8 files changed, 9 insertions(+), 32 deletions(-) rename lib/alembic.ini => alembic.ini (100%) rename lib/debug.py => debug.py (100%) rename lib/freebies.db => freebies.db (98%) delete mode 100644 lib/migrations/versions/7a71dbf71c64_create_db.py rename {lib/migrations => migrations}/README (100%) rename {lib/migrations => migrations}/env.py (97%) rename {lib/migrations => migrations}/script.py.mako (100%) rename lib/migrations/versions/5f72c58bf48c_create_companies_devs.py => migrations/versions/864bb5434c61_initial_migration.py (83%) diff --git a/lib/alembic.ini b/alembic.ini similarity index 100% rename from lib/alembic.ini rename to alembic.ini diff --git a/lib/debug.py b/debug.py similarity index 100% rename from lib/debug.py rename to debug.py diff --git a/lib/freebies.db b/freebies.db similarity index 98% rename from lib/freebies.db rename to freebies.db index 12beb1c963e832db481e7a7493e3029e691ac4dc..80e5db7e3257a576aaf5a0778ea93f23c1d935ca 100644 GIT binary patch delta 56 zcmZozz}T>Wae_1>%S0JxRu%@mvd)bu6Xba;%uJG!OiheUlFbY^DSY8a5m;oP0079) B54->X delta 56 zcmZozz}T>Wae_1>>qHr6R#pbRc-f696XbbJ)69*MO)ZkrOe~T&DSY8a5m;oP006@2 B5D@?X diff --git a/lib/migrations/versions/7a71dbf71c64_create_db.py b/lib/migrations/versions/7a71dbf71c64_create_db.py deleted file mode 100644 index 23e0a655b..000000000 --- a/lib/migrations/versions/7a71dbf71c64_create_db.py +++ /dev/null @@ -1,24 +0,0 @@ -"""create db - -Revision ID: 7a71dbf71c64 -Revises: -Create Date: 2023-03-15 15:05:55.516631 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = '7a71dbf71c64' -down_revision = None -branch_labels = None -depends_on = None - - -def upgrade() -> None: - pass - - -def downgrade() -> None: - pass diff --git a/lib/migrations/README b/migrations/README similarity index 100% rename from lib/migrations/README rename to migrations/README diff --git a/lib/migrations/env.py b/migrations/env.py similarity index 97% rename from lib/migrations/env.py rename to migrations/env.py index c7aab9656..a82af8b99 100644 --- a/lib/migrations/env.py +++ b/migrations/env.py @@ -7,6 +7,7 @@ # this is the Alembic Config object, which provides # access to the values within the .ini file in use. +from lib.models import Base config = context.config # Interpret the config file for Python logging. @@ -18,7 +19,7 @@ # for 'autogenerate' support # from myapp import mymodel # target_metadata = mymodel.Base.metadata -from models import Base + target_metadata = Base.metadata # other values from the config, defined by the needs of env.py, @@ -66,7 +67,7 @@ def run_migrations_online() -> None: with connectable.connect() as connection: context.configure( - connection=connection, target_metadata=target_metadata, render_as_batch=True, + connection=connection, target_metadata=target_metadata ) with context.begin_transaction(): diff --git a/lib/migrations/script.py.mako b/migrations/script.py.mako similarity index 100% rename from lib/migrations/script.py.mako rename to migrations/script.py.mako diff --git a/lib/migrations/versions/5f72c58bf48c_create_companies_devs.py b/migrations/versions/864bb5434c61_initial_migration.py similarity index 83% rename from lib/migrations/versions/5f72c58bf48c_create_companies_devs.py rename to migrations/versions/864bb5434c61_initial_migration.py index c191bb2f9..f8484b3c9 100644 --- a/lib/migrations/versions/5f72c58bf48c_create_companies_devs.py +++ b/migrations/versions/864bb5434c61_initial_migration.py @@ -1,8 +1,8 @@ -"""create companies, devs +"""initial migration -Revision ID: 5f72c58bf48c -Revises: 7a71dbf71c64 -Create Date: 2023-03-15 15:06:20.944586 +Revision ID: 864bb5434c61 +Revises: +Create Date: 2025-05-28 13:01:10.801971 """ from alembic import op @@ -10,8 +10,8 @@ # revision identifiers, used by Alembic. -revision = '5f72c58bf48c' -down_revision = '7a71dbf71c64' +revision = '864bb5434c61' +down_revision = None branch_labels = None depends_on = None From 56ee994a9e3219d9d839e3620541347e073b79a5 Mon Sep 17 00:00:00 2001 From: Kennedy Ouma Odero Date: Wed, 28 May 2025 20:40:01 +0300 Subject: [PATCH 2/3] feat: add freebies table, update model instances --- .../versions/864bb5434c61_initial_migration.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/migrations/versions/864bb5434c61_initial_migration.py b/migrations/versions/864bb5434c61_initial_migration.py index f8484b3c9..773a3459b 100644 --- a/migrations/versions/864bb5434c61_initial_migration.py +++ b/migrations/versions/864bb5434c61_initial_migration.py @@ -18,6 +18,17 @@ def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### + + op.create_table('freebies', + sa.Column('id', sa.Integer(), primary_key=True, nullable=False), + sa.Column('item_name', sa.String(), nullable=True), + sa.Column('value', sa.Integer, nullable=False), + sa.Column('dev_id', sa.Integer, sa.ForeignKey('devs.id'), nullable=False), + sa.Column('company_id', sa.Integer, sa.ForeignKey('companies.id'), nullable=False) + sa.Column('created_at', sa.DateTime(), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=False), + sa.Column('updated_at', sa.DateTime(), server_default=sa.text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'), nullable=False), + ) + op.create_table('companies', sa.Column('id', sa.Integer(), nullable=False), sa.Column('name', sa.String(), nullable=True), @@ -36,4 +47,5 @@ def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### op.drop_table('devs') op.drop_table('companies') + op.drop_table('freebies') # ### end Alembic commands ### From 80505429218f33b1514738a4d893d2fa8218a5bc Mon Sep 17 00:00:00 2001 From: Kennedy Ouma Odero Date: Wed, 28 May 2025 21:53:34 +0300 Subject: [PATCH 3/3] feat: add all model codes, db data frm seed file and debug test code --- .gitignore | 2 + database.db | 0 debug.py | 37 ++++++++-- freebies.db | Bin 20480 -> 24576 bytes lib/models.py | 64 ++++++++++++++++-- lib/seed.py | 64 ++++++++++++++++++ migrations/env.py | 4 +- .../06c3680d6ebe_create_freebies_table.py | 28 ++++++++ ..._update_models_class_company_class_dev_.py | 51 ++++++++++++++ ...5bddbb980a_update_freebies_foreign_keys.py | 24 +++++++ .../864bb5434c61_initial_migration.py | 44 +++++++++--- 11 files changed, 301 insertions(+), 17 deletions(-) create mode 100644 database.db create mode 100644 migrations/versions/06c3680d6ebe_create_freebies_table.py create mode 100644 migrations/versions/3e48a4a672f6_update_models_class_company_class_dev_.py create mode 100644 migrations/versions/635bddbb980a_update_freebies_foreign_keys.py diff --git a/.gitignore b/.gitignore index 1fcadf3de..f7075c56e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ # Created by https://www.gitignore.io/api/node .DS_Store +# databases +freebies.db ### Node ### # Logs diff --git a/database.db b/database.db new file mode 100644 index 000000000..e69de29bb diff --git a/debug.py b/debug.py index 4f922eb69..02cd1e971 100644 --- a/debug.py +++ b/debug.py @@ -1,9 +1,38 @@ #!/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 +engine = create_engine('sqlite:///freebies.db') +Session = sessionmaker(bind=engine) +session = Session() -if __name__ == '__main__': - engine = create_engine('sqlite:///freebies.db') - import ipdb; ipdb.set_trace() + +#testing relationships +Kennedy = session.query(Dev).filter_by(name="Kennedy").first() +print(Kennedy.freebies) +print(Kennedy.company) + +TechTrend = session.query(Company).filter_by(name="TechTrend").first() +print(TechTrend.freebies) +print(TechTrend.devs) + +freebie = Diana.freebies[0] +print(freebie.dev) +print(freebie.company) + +# Test aggregate methods +print(freebie.print_details()) +print(Kennedy.received_one("T-shirt")) +print(Kennedy.received_one("Laptop")) + +Julia = session.query(Dev).filter_by(name="Julia").first() +SoftPeak.give_freebie(Julia, "Pen", 3) +session.commit() + +print(Company.oldest_company()) + +Fiona.give_away(bob, freebie) +session.commit() +print(freebie.dev) \ No newline at end of file diff --git a/freebies.db b/freebies.db index 80e5db7e3257a576aaf5a0778ea93f23c1d935ca..f56f4c2dd135f0cd8e8bf5a334136322227c4e69 100644 GIT binary patch literal 24576 zcmeI)&ub%9902e)Kaxq(W?mP!6kTfHvXnMdP2FnIgJ7CYx7kh8ZZfs(UWS*qV*u^$!paf>&=|JctL+A_{u+EnnH?#UM2(~WXPP9IZC=b2y>K_=-?r*26|@jZWjNJ5|aes zEdI=V!+b&>LIMF0009sH0T2KI5C8!X_#XCyNtY2s1`R1qoo7d>9fCV z=dyuwPL~bQJ)r#X++v^6fVqy`-b6#LTN{PlvP~9>yVa^yu^qd#W!3D$*3QDnWcvs1 zKW(~GEo~L5cgQX44q5cvTzKup?MltA79&_@F|L zRILq5PPu5+$Z1oPQwqm!^Q_~iavKezV93|>PPq1IkU+r z#>~=^@@9HC8`@#ry4P?9%149}hM&Ym3$X!4^b6@J`gWmfQSNd7?r z0T2KI5C8!X009sH0T2KI5C8!XctiwDMV((>ZLF-mum8vE;?dg{&K|lG2H)W@Gio? z;_vZS_;dU*{t&-|@8OmVLIMF0009sH0T2KI5C8!X009sH0T4J};8I3IxtsltN68lT z1CO)UvuO=oEm2PPyiQMWoYK(zCgq&A$T}T(y~~D%@;8|9_Ziuvy_S4nK_Ix9)X=q! z@Yw^T*r9$qn~=R&1KG`v-1c`Sbq&p}dsG&e8M~y(Q7zwVwB-P#*7bsxsmk_iqE2p# z7MIZ}MMDene*m1hhh*Djz6kgK6WLD?{u+OPn>cU&VSZu0XWlihWq*-jNFV?LAOHd& z00JNY0w4eaAOHgYoxtiu3e72slFx66eviqmplf6ju}2xk0;`#*-EM7-toz=8Wzu@A zS}gEqYq?$GNr|8#R4y;QfPkIY)|f0eX=Hkpu;8&HC8hgST<7Vv0>9q z8a$p%#wx@D&m~jn%CJRQJ_?fhZYpsBk>x}*&JN?6eh~{jvZ#oF)rDwhv)hYR7ie%@2}eoGQS7H{Ezb`w$DCq;KLO$MIjR5v delta 120 zcmZoTz}T>Wae}lU3j+fKD-go~^F$qEQ5FWhvQA$99}FyfQVjgO{5$#T`J^@r3M}K@ sEX8+AkjKKzBq_<%#MmU+%y5&!7k(jR0bY<%0zlRG`6o`0W<%uy0GJ&awg3PC diff --git a/lib/models.py b/lib/models.py index 2681bee5a..6063f7744 100644 --- a/lib/models.py +++ b/lib/models.py @@ -13,17 +13,73 @@ class Company(Base): __tablename__ = 'companies' id = Column(Integer(), primary_key=True) - name = Column(String()) - founding_year = Column(Integer()) + name = Column(String(), nullable=False) + founding_year = Column(Integer(), nullable=True) + + #Relationship to freebies + freebies = relationship("Freebie", backref="company") + devs = relationship("Dev", secondary="freebies", back_populates="companies", overlaps="company,freebies") + + #new freebies instance + def give_freebie(self, dev, item_name, value): + """Creates and returns a new Freebie instance.""" + freebie = Freebie(item_name=item_name, value=value, dev=dev, company=self) + return freebie + + @classmethod + def oldest_company(cls): + """Returns the Company with the earliest founding year.""" + return cls.query.order_by(cls.founding_year).first() def __repr__(self): - return f'' + return f'' + #return session.query(cls).order_by(cls.founding_year.asc()).first() class Dev(Base): __tablename__ = 'devs' id = Column(Integer(), primary_key=True) - name= Column(String()) + name= Column(String(), nullable=False) + + # Relationship + freebies = relationship("Freebie", backref="dev") + companies = relationship("Company", secondary="freebies", back_populates="devs", overlaps="dev,freebies") + + + #new dev instances + def received_one(self, item_name): + """Returns True if dev has a freebie with item_name, else False.""" + return any(freebie.item_name == item_name for freebie in self.freebies) + + def give_away(self, dev, freebie): + """Transfers freebie to another dev if owned by this dev.""" + if freebie.dev == self: + freebie.dev = dev def __repr__(self): return f'' + + +class Freebie(Base): + __tablename__ = 'freebies' + + id = Column(Integer(), primary_key=True) + item_name = Column(String(), nullable=False) + value = Column(Integer, nullable=False) + dev_id = Column(Integer, ForeignKey('devs.id'), nullable=False) + company_id = Column(Integer, ForeignKey('companies.id'), nullable=False) + + created_at = Column(String, server_default='CURRENT_TIMESTAMP', nullable=False) + updated_at = Column(String, server_default='CURRENT_TIMESTAMP', onupdate='CURRENT_TIMESTAMP', nullable=False) + + #Relationships + dev = relationship( "Dev", backref=backref("freebies", overlaps="devs"), overlaps="devs") + company = relationship("Company", backref=backref("freebies", overlaps="company")) + + #instance to format freebies + def print_details(self): + """Returns formatted string with freebie details.""" + return f"{self.dev.name} owns a {self.item_name} from {self.company.name}" + + def __repr__(self): + return f'' \ No newline at end of file diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..22f07d7cc 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,67 @@ #!/usr/bin/env python3 # Script goes here! +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Base, Company, Dev, Freebie + +engine = create_engine('sqlite:///freebies.db') +Base.metadata.create_all(engine) +Session = sessionmaker(bind=engine) +session = Session() + + +#Clearing existing data +session.query(Freebie).delete() +session.query(Company).delete() +session.query(Dev).delete() + + +#Create companies +companies = [ + Company(name="KenTechnologies", founding_year=2021), + Company(name="TechTrend", founding_year=1999), + Company(name="CodeZap", founding_year=2000), + Company(name="Innovatech", founding_year=2015), + Company(name="SoftPeak", founding_year=2019), + Company(name="HackWave", founding_year=2023) +] +session.add_all(companies) + + +#Create devs +devs = [ + Dev(name="Kennedy Odero"), + Dev(name="Bob Johnson"), + Dev(name="Erickson Smith"), + Dev(name="Diana Lee"), + Dev(name="Evan Patel"), + Dev(name="Fiona Clark"), + Dev(name="George Washington"), + Dev(name="Hannah Davis"), + Dev(name="Ian Wilson"), + Dev(name="Julia Martinez") +] +session.add_all(devs) + + +#Create freebies +freebies = [ + Freebie(item_name="T-Shirt", value=20, dev=devs[0], company=companies[0]), # Kennedy from KenTechnologies + Freebie(item_name="Mug", value=15, dev=devs[0], company=companies[1]), # Kennedy from TechTrend + Freebie(item_name="Sticker", value=5, dev=devs[1], company=companies[0]), # Bob from KenTechnologies + Freebie(item_name="Notebook", value=10, dev=devs[2], company=companies[2]), # Erickson from CodeZap + Freebie(item_name="Pen", value=3, dev=devs[3], company=companies[3]), # Diana from Innovatech + Freebie(item_name="Lanyard", value=8, dev=devs[4], company=companies[4]), # Evan from SoftPeak + Freebie(item_name="Hat", value=25, dev=devs[5], company=companies[5]), # Fiona from HackWave + Freebie(item_name="Water Bottle", value=12, dev=devs[6], company=companies[1]), # George from TechTrend + Freebie(item_name="Backpack", value=30, dev=devs[7], company=companies[2]), # Hannah from CodeZap + Freebie(item_name="USB Drive", value=10, dev=devs[8], company=companies[3]), # Ian from Innovatech + Freebie(item_name="Mouse Pad", value=7, dev=devs[9], company=companies[4]) # Julia from SoftPeak +] +session.add_all(freebies) + + +# Committing the session to save all changes and closing the session +session.commit() +session.close() \ No newline at end of file diff --git a/migrations/env.py b/migrations/env.py index a82af8b99..28f6225ee 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -67,7 +67,9 @@ def run_migrations_online() -> None: with connectable.connect() as connection: context.configure( - connection=connection, target_metadata=target_metadata + connection=connection, target_metadata=target_metadata, render_as_batch=True + # render_as_batch=True is used for SQLite to handle table alterations + # and is not necessary for other databases. ) with context.begin_transaction(): diff --git a/migrations/versions/06c3680d6ebe_create_freebies_table.py b/migrations/versions/06c3680d6ebe_create_freebies_table.py new file mode 100644 index 000000000..f46ff8899 --- /dev/null +++ b/migrations/versions/06c3680d6ebe_create_freebies_table.py @@ -0,0 +1,28 @@ +"""create freebies table + +Revision ID: 06c3680d6ebe +Revises: 864bb5434c61 +Create Date: 2025-05-28 15:59:05.226217 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '06c3680d6ebe' +down_revision = '864bb5434c61' +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/migrations/versions/3e48a4a672f6_update_models_class_company_class_dev_.py b/migrations/versions/3e48a4a672f6_update_models_class_company_class_dev_.py new file mode 100644 index 000000000..6a26e6d43 --- /dev/null +++ b/migrations/versions/3e48a4a672f6_update_models_class_company_class_dev_.py @@ -0,0 +1,51 @@ +"""update models class Company, class Dev, class freebies functions with relationships and instance + +Revision ID: 3e48a4a672f6 +Revises: 06c3680d6ebe +Create Date: 2025-05-28 16:38:17.626007 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '3e48a4a672f6' +down_revision = '06c3680d6ebe' +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=False), + sa.Column('value', sa.Integer(), nullable=False), + sa.Column('dev_id', sa.Integer(), nullable=False), + sa.Column('company_id', sa.Integer(), nullable=False), + sa.Column('created_at', sa.String(), server_default='CURRENT_TIMESTAMP', nullable=False), + sa.Column('updated_at', sa.String(), server_default='CURRENT_TIMESTAMP', nullable=False), + 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') + ) + op.alter_column('companies', 'name', + existing_type=sa.VARCHAR(), + nullable=False) + op.alter_column('devs', 'name', + existing_type=sa.VARCHAR(), + nullable=False) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column('devs', 'name', + existing_type=sa.VARCHAR(), + nullable=True) + op.alter_column('companies', 'name', + existing_type=sa.VARCHAR(), + nullable=True) + op.drop_table('freebies') + # ### end Alembic commands ### diff --git a/migrations/versions/635bddbb980a_update_freebies_foreign_keys.py b/migrations/versions/635bddbb980a_update_freebies_foreign_keys.py new file mode 100644 index 000000000..30642825c --- /dev/null +++ b/migrations/versions/635bddbb980a_update_freebies_foreign_keys.py @@ -0,0 +1,24 @@ +"""Update freebies foreign keys + +Revision ID: 635bddbb980a +Revises: 3e48a4a672f6 +Create Date: 2025-05-28 21:21:41.152742 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '635bddbb980a' +down_revision = '3e48a4a672f6' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + pass + + +def downgrade() -> None: + pass diff --git a/migrations/versions/864bb5434c61_initial_migration.py b/migrations/versions/864bb5434c61_initial_migration.py index 773a3459b..13a1d1166 100644 --- a/migrations/versions/864bb5434c61_initial_migration.py +++ b/migrations/versions/864bb5434c61_initial_migration.py @@ -18,17 +18,20 @@ def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### + - op.create_table('freebies', - sa.Column('id', sa.Integer(), primary_key=True, nullable=False), - sa.Column('item_name', sa.String(), nullable=True), - sa.Column('value', sa.Integer, nullable=False), - sa.Column('dev_id', sa.Integer, sa.ForeignKey('devs.id'), nullable=False), - sa.Column('company_id', sa.Integer, sa.ForeignKey('companies.id'), nullable=False) - sa.Column('created_at', sa.DateTime(), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=False), - sa.Column('updated_at', sa.DateTime(), server_default=sa.text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'), nullable=False), + op.create_table( + 'freebies', + sa.Column('id', sa.Integer(), primary_key=True, nullable=False), + sa.Column('item_name', sa.String(), nullable=False), + sa.Column('value', sa.Integer, nullable=False), + sa.Column('dev_id', sa.Integer, sa.ForeignKey('devs.id'), nullable=False), + sa.Column('company_id', sa.Integer, sa.ForeignKey('companies.id'), nullable=False), + sa.Column('created_at', sa.DateTime, server_default=sa.func.now(), nullable=False), + sa.Column('updated_at', sa.DateTime, server_default=sa.func.now(), onupdate=sa.func.now(), nullable=False) ) + op.create_table('companies', sa.Column('id', sa.Integer(), nullable=False), sa.Column('name', sa.String(), nullable=True), @@ -42,8 +45,33 @@ def upgrade() -> None: ) # ### end Alembic commands ### + # Alter 'companies.name' to be NOT NULL + with op.batch_alter_table('companies', schema=None) as batch_op: + batch_op.alter_column('name', + existing_type=sa.VARCHAR(), + nullable=False) + + # Alter 'devs.name' to be NOT NULL + with op.batch_alter_table('devs', schema=None) as batch_op: + batch_op.alter_column('name', + existing_type=sa.VARCHAR(), + nullable=False) + def downgrade() -> None: + + # Revert 'devs.name' to be NULLABLE + with op.batch_alter_table('devs', schema=None) as batch_op: + batch_op.alter_column('name', + existing_type=sa.VARCHAR(), + nullable=True) + + # Revert 'companies.name' to be NULLABLE + with op.batch_alter_table('companies', schema=None) as batch_op: + batch_op.alter_column('name', + existing_type=sa.VARCHAR(), + nullable=True) + # ### commands auto generated by Alembic - please adjust! ### op.drop_table('devs') op.drop_table('companies')