我用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?
我甚至尝试打印db.metadata.sorted_tables
,以确保正确导入数据库元数据。果然,整个数据库模式都通过管道传输到终端。那么,Alembic为什么要生成空白的升级/降级功能呢?
我的结论是这个问题与db.init_app(app)
和db = SQLAlchemy(app)
的差异有关,但我不太确定是什么导致了这个问题。为了验证这个理论,我将env.py
中的from database import db
替换为db = SQLAlchemy(app)
。可能是个坏主意,但我想看看出于调试目的会发生什么。
Alembic自动生成并填充upgrade()和degrade()方法-除非它们是相反的!upgrade()
删除了我的所有三个表,而downgrade()
使用所有正确的列和元数据创建了它们。我不知道这是为什么,但我希望它有助于人们试图找出这个问题。
目前没有回答
相关问题 更多 >
编程相关推荐