ele*_*119 13 python sqlalchemy flask flask-sqlalchemy alembic
我正在使用Alembic来处理Flask的迁移.alembic revision --autogenerate理论上,应根据数据库中的更改自动生成迁移.但是,Alembic只是使用上述命令生成空白迁移.
有一个问题与这个问题非常相似,问题在于没有导入正确的模型.但是,我从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)
...
Run Code Online (Sandbox Code Playgroud)
以及导入的db元数据env.py('start'是我的Flask应用程序主文件的名称):
...
from start import db
target_metadata = db.metadata
...
Run Code Online (Sandbox Code Playgroud)
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 ###
Run Code Online (Sandbox Code Playgroud)
这是一个要点,显示我的应用程序的文件结构,以及一些额外的代码.似乎问题是Alembic不喜欢database.py先导入数据库而不先进行初始化__init__.py.但是,当使用蓝图时(由于循环导入),这是不可能的,在此SO答案中解释:https://stackoverflow.com/a/9695045/353878.
所以问题是,当使用Flask蓝图时,如何使用Alembic?
我甚至尝试过打印db.metadata.sorted_tables,以确保正确导入数据库元数据.果然,整个数据库架构被传送到终端.那么为什么Alembic会产生空白的升级/降级功能呢?
我的结论是,这个问题有什么做的分歧db.init_app(app)和db = SQLAlchemy(app),但我不能肯定是什么原因造成的问题.为了验证这一理论,我更换from database import db的env.py是db = SQLAlchemy(app).可能是一个坏主意,但我想看看调试目的会发生什么.
Alembic自动生成并填充了upgrade()和downgrade()方法 - 除了它们被颠倒了!upgrade()删除了我的所有三个表,同时downgrade()使用所有正确的列和元数据创建它们.我不知道为什么会这样,但我希望它对试图解决这个问题的人有所帮助.
dav*_*ism 28
以下是我如何使用Alembic和Flask以及蓝图.
https://github.com/davidism/basic_flask
我使用应用程序工厂模式并db.init_app在其中调用.在db = SQLAlchemy()我导入所有将继承的模型db.Model以便db.metadata了解它们之后; 请注意,这不是在create_app工厂中完成的,而是在模块初始化期间内联.
运行时alembic,项目文件夹不包含在内,sys.path所以我进行了设置.然后我从工厂创建一个应用程序并sqlalchemy.url从其配置中进行设置.另外,我导入db并设置target_metadata = db.metadata.
无论项目结构如何,此设置始终适用于我.我在一个包含蓝图的子包中包含了一组非常基本的用户模型和一个非常愚蠢的视图.只需确保加载相关模型load_models,在定义蓝图后导入视图,然后导入蓝图init_views.
| 归档时间: |
|
| 查看次数: |
4859 次 |
| 最近记录: |