Alembic自动生成空Flasksqlalchemy迁移

2024-05-10 07:13:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Alembic来处理烧瓶的迁移。alembic revision --autogenerate理论上应该根据数据库中的更改自动生成迁移。但是,Alembic只是用上面的命令生成一个空白迁移。

有一个question very similar to this one,问题是没有导入正确的模型。但是,我已经从Flask应用程序导入了模型,如env.py

...
# import settings from Flask
alembic_config = config.get_section(config.config_ini_section)
from start import app
from models import User, Item, Recipient # models are imported here from models.py
alembic_config['sqlalchemy.url'] = app.config['SQLALCHEMY_DATABASE_URI']

engine = engine_from_config(
            alembic_config, # config.get_section(config.config_ini_section)
            prefix='sqlalchemy.',
            poolclass=pool.NullPool)
...

以及在env.py中导入的数据库元数据('start'是我的烧瓶应用程序主文件的名称):

...
from start import db
target_metadata = db.metadata
...

运行alembic revision --autogenerate -m "initial_rev"然后生成一个空迁移,尽管我的Flask应用程序可能会有所不同:

"""initial_rev

Revision ID: 45296fd29540
Revises: None
Create Date: 2013-06-19 17:32:38.392268

"""

# revision identifiers, used by Alembic.
revision = '45296fd29540'
down_revision = None

from alembic import op
import sqlalchemy as sa


def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    pass
    ### end Alembic commands ###


def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    pass
    ### end Alembic commands ###

编辑

显示我的应用程序的文件结构的Here is a gist,以及一些附加代码。问题似乎是Alembic不喜欢在没有初始化的情况下从database.py导入db。然而,当使用蓝图时,这是不可能的(因为周期性的导入),在这个SO答案中解释为:https://stackoverflow.com/a/9695045/353878

所以问题是,在使用烧瓶蓝图的同时,如何使用Alembic?

编辑#2

我甚至尝试打印db.metadata.sorted_tables,以确保正确导入数据库元数据。果然,整个数据库模式都通过管道传输到终端。那么,Alembic为什么要生成空白的升级/降级功能呢?

编辑#3

我的结论是这个问题与db.init_app(app)db = SQLAlchemy(app)的差异有关,但我不太确定是什么导致了这个问题。为了验证这个理论,我将env.py中的from database import db替换为db = SQLAlchemy(app)。可能是个坏主意,但我想看看出于调试目的会发生什么。

Alembic自动生成并填充upgrade()和degrade()方法-除非它们是相反的!upgrade()删除了我的所有三个表,而downgrade()使用所有正确的列和元数据创建了它们。我不知道这是为什么,但我希望它有助于人们试图找出这个问题。


Tags: frompyimportconfig数据库app应用程序flask