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 个回答
2
配置 alembic 以连接到你的数据库
你有没有把目标元数据设置为你的基础元数据?
来自 文档。
要使用自动生成,我们首先需要修改我们的 env.py 文件,以便它能够访问一个包含目标的表元数据对象。假设我们的应用程序在 myapp.mymodel 中有一个声明性基础。这个基础包含一个 MetaData 对象,其中定义了我们的数据库表对象。我们需要确保这个对象在 env.py 中被加载,然后通过 target_metadata 参数传递给 EnvironmentContext.configure()。在通用模板中使用的 env.py 示例脚本的顶部已经有一个变量声明,方便我们使用,我们只需把 None 替换为我们的 MetaData。开始时是:
# add your model's 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