我试图首次对预先存在的数据库自动生成一个alembic修订版,但是当我运行以下命令时
alembic revision --autogenerate
Run Code Online (Sandbox Code Playgroud)
它会生成一个迁移,尝试在我的数据库中创建每个表和索引.与此类似:
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 ..
Run Code Online (Sandbox Code Playgroud)
然后,如果我尝试运行迁移,它将失败,因为对象已经存在:
sqlalchemy.exc.ProgrammingError: (ProgrammingError) relation "table1" already exists
Run Code Online (Sandbox Code Playgroud)
所以在我看来,像alembic认为我的数据库不包含任何表,但确实如此.
任何想法为什么会这样?
您是否将 target_metadata 设置为您的基本元数据?
从文档中。
要使用自动生成,我们首先需要修改 env.py,以便它可以访问包含目标的表元数据对象。假设我们的应用程序在 myapp.mymodel 中有一个声明性基础。该库包含一个 MetaData 对象,其中包含定义我们数据库的 Table 对象。我们确保将其加载到 env.py 中,然后通过 target_metadata 参数传递给 EnvironmentContext.configure() 。为了方便起见,通用模板中使用的 env.py 示例脚本已经在顶部附近有一个变量声明,我们将 None 替换为元数据。从...开始:
# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
target_metadata = None
Run Code Online (Sandbox Code Playgroud)
我们改为:
from myapp.mymodel import Base
target_metadata = Base.metadata
Run Code Online (Sandbox Code Playgroud)