Alembic --autogenerate尝试重新创建每个表

时间:2014-06-26 13:50:32

标签: python alembic

我试图首次针对预先存在的数据库自动生成一个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 个答案:

答案 0 :(得分:2)

配置alembic以查看您的数据库

您是否已将target_metadata设置为Base元数据?

来自documentation

  

要使用autogenerate,我们首先需要修改我们的env.py   可以访问包含目标的表元数据对象。   假设我们的应用程序在myapp.mymodel中有一个声明性基础。这个   base包含一个MetaData对象,其中包含Table对象的定义   数据库。我们确保将其加载到env.py中然后传递给   EnvironmentContext.configure()通过target_metadata参数。该   通用模板中使用的env.py示例脚本已经有了   为方便起见,我们在附近的变量声明   用我们的MetaData替换None。从:

开始
# 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