Alembic --autogenerate пытается воссоздать каждый стол

Я пытаюсь автогенерировать ревизию alembic в первый раз по сравнению с уже существующей базой данных, но когда я запускаю следующую команду

alembic revision --autogenerate

Он создает миграцию, которая пытается создать каждую таблицу и индекс в моей базе данных. Аналогично этому:

def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.create_table('table1',
    sa.Column('id', sa.SmallInteger(), nullable=False),
    sa.Column('name', sa.String(length=100), nullable=True),
    sa.Column('desc', sa.Text(), nullable=True),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('name'),
    schema='schema1'
    )
    op.create_index(op.f('ix_index1'), 'table1', ['name'], unique=False, schema='schema1')
    ... all my other tables/indexes ..


def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.drop_index(op.f('ix_index1'), table_name='table1', schema='schema1')
    op.drop_table('table1', schema='schema1')
    ... all my other tables/indexes ..

Затем, если я попытаюсь выполнить миграцию, она терпит неудачу, потому что объекты уже существуют:

sqlalchemy.exc.ProgrammingError: (ProgrammingError) relation "table1" already exists

Итак, мне кажется, что alembic считает, что моя база данных не содержит никаких таблиц, но она делает.

Любые идеи, почему это может происходить?

Ответ 1

Настроить alembic, чтобы посмотреть вашу базу данных

Установили ли целевые метаданные метаданные Base?

Из документации.

Чтобы использовать автогенератор, сначала нам нужно изменить наш env.py, чтобы он получает доступ к объекту метаданных таблицы, который содержит цель. Предположим, что наше приложение имеет декларативную базу в myapp.mymodel. Эта base содержит объект MetaData, который содержит объекты таблицы, определяющие нашей базе данных. Мы уверены, что это загружено в env.py, а затем передано EnvironmentContext.configure() через аргумент target_metadata. Пример env.py script, используемый в шаблоне generic, уже имеет объявление переменной в верхней части для нашего удобства, где мы замените None на наш MetaData. Начиная с:

# add your model MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata 
target_metadata = None

изменим на:

from myapp.mymodel import Base
target_metadata = Base.metadata