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