5

I'm trying to connect the alembic library to the databases and sqlalchemy libraries. As a guide, I use this example link

My projects file:

db.py

from databases import Database
from sqlalchemy import MetaData, create_engine

DATABASE_URL = "postgresql://....@localhost:5432/db"

engine = create_engine(DATABASE_URL)
metadata = MetaData()

database = Database(DATABASE_URL)

models.py

from sqlalchemy import Table, Column, Integer, String, DateTime
from sqlalchemy.sql import func

from db import metadata

notes = Table(
    "notes",
    metadata,
    Column("id", Integer, primary_key=True),
    Column("title", String(50)),
    Column("description", String(50)),
    Column("created_date", DateTime, default=func.now(), nullable=False),
)

env.py (alembic settings)

from db import DATABASE_URL, metadata

....
#add new
target_metadata = metadata
...
#change
def run_migrations_online():

    config.set_main_option('sqlalchemy.url', str(DATABASE_URL))
    connectable = engine_from_config(
        config.get_section(config.config_ini_section),
        prefix="sqlalchemy.",
        poolclass=pool.NullPool,
    )

When I run

alembic revision --autogenerate -m 'Add notest table'

the new file at migrations/versions this context is created

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    pass
    # ### end Alembic commands ###


def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    pass
    # ### end Alembic commands ###

I suppose it may be related to the use of the target_metadata = metadata variable. It seems to be all according to instructions, but the migrations do not work as expected.

Jekson
  • 2,892
  • 8
  • 44
  • 79

1 Answers1

15

If anyone has a similar problem. All you have to do is import the tables from models.py into the env.py file before metadata object.

env.py

...
from models.notes import notes
from db import DATABASE_URL, metadata
...
Jekson
  • 2,892
  • 8
  • 44
  • 79
  • 2
    If they are not imported those classes are never defined and metadata is never populated. – Gabriel Cappelli Jul 17 '20 at 16:06
  • 2
    @GabrielCappelli but what shall I do in the case when I have dozens or even hundreds of models? Import all of them? Maybe there is a better way than `from mymodels import *`? – amarynets Mar 09 '21 at 19:22
  • You could try to import those dynamically. https://stackoverflow.com/questions/301134/how-to-import-a-module-given-its-name-as-string – Gabriel Cappelli Mar 09 '21 at 21:54