我正在使用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)
...
以及中导入的数据库元数据env.py(“ start”是我的Flask应用程序主文件的名称):
...
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 ###
编辑
这里的要点显示了我的应用程序的文件结构,以及一些其他代码。看来问题在于,Alembic不喜欢在database.py
不首先初始化的情况下从中导入数据库__init__.py
。但是,当使用蓝图时(由于周期性导入),这是不可能的,对此SO答案进行了解释:https : //stackoverflow.com/a/9695045/353878。
所以问题是,当同时使用烧瓶蓝图时,如何使用Alembic?
编辑#2
我什至尝试打印db.metadata.sorted_tables
,以确保正确导入了数据库元数据。可以肯定的是,整个数据库模式已通过管道传输到终端。那么,为何Alembic会生成空白的升级/降级功能?
编辑#3
我的结论是,这个问题有什么做的分歧db.init_app(app)
和db = SQLAlchemy(app)
,但我不能肯定是什么原因造成的问题。为了验证这一理论,我更换from database import db
的env.py
是db = SQLAlchemy(app)
。可能是个坏主意,但我想看看出于调试目的会发生什么。
Alembic自动生成并填充了upgrade()
和downgrade()
方法-除非它们被反转了!upgrade()
删除了我的所有三个表,同时downgrade()
使用所有适当的列和元数据创建了它们。我不知道为什么会这样,但是我希望它对尝试解决此问题的人们有所帮助。
我使用应用程序工厂模式并db.init_app
在其中调用。之后db = SQLAlchemy()
我导入,将继承所有车型db.Model
,从而db.metadata
知道他们的; 请注意,这不是在create_app
工厂完成的,而是在模块初始化期间内联的。
运行时alembic
,项目文件夹不包括在内,sys.path
因此我进行了设置。然后,我从工厂创建一个应用,并sqlalchemy.url
根据其配置进行设置。另外,我导入db
并设置target_metadata = db.metadata
。
无论项目结构如何,此设置始终对我有效。我在带有蓝图的子包中包含了一组非常基本的用户模型和一个非常愚蠢的视图。只需确保将relavent
模型加载到中load_models
,在定义了蓝图之后导入视图,并在中导入蓝图init_views
。
问题内容: 我很难让Alembic使用(Flask-SQLAlchemy)而不是自动生成从更改到类的候选迁移。 我已经进行了修改,以创建我的Flask应用,导入所有相关模型,初始化数据库,然后运行迁移: 这种方法适用于(例如,当重新创建用于单元测试的测试数据库时),但是在这种情况下,它似乎无法实现。自动生成的版本脚本始终具有空的升级和降级方法,例如, 我的更改包括重命名列,更改列定义等,而不仅仅是
我正在尝试创建一个迁移,alembic正在运行,但是我得到了一个错误: 失败:无法继续使用--autogenerate选项;环境脚本/Users/paul/python/my_project/alembic/env。py不向上下文提供元数据对象或对象序列。 我不知道为什么我得到这个错误,因为我已经在env.py文件中设置了target_metadata,并将文件夹添加到路径中。我尝试从我的另一个项
问题内容: 我有一个Webapp,允许用户创建自己的字段,以供以后使用表单呈现。 我有一个像这样的Formfield模型: 我用来代表字段的类型,无论是哪种类型(复选框,输入,以后都会有更多)。 如你所见,每个字段都有一个form_id的FK。 我正在尝试为给定的form_id生成动态表单。问题是我需要确定要为每个Formfield呈现的字段的类型。因此,我还需要在某个时候处理字段类型。 我想一个
问题内容: 如何设置初始化我的Flask应用程序以将Flask-SQLAlchemy设置为自动提交模式,除非我明确地不使用事务? 会话“ 开始通信后即开始数据库事务 ”。这是否会影响Postgres的难度比MySQL? 通过Instagram, 自动提交模式;在这种模式下,Psycopg2不会对任何查询发出BEGIN / COMMIT;相反,每个查询都在其自己的单语句事务中运行。这对于不需要事务语
问题内容: 我有一个简单的用户模型,定义如下: 当我创建一个新的User对象时,我的字段将设置为当前时间。我想要做的是使它每当我将更改保存到User对象时,我的字段就会自动设置为当前时间。 我已经仔细阅读过文档,但是对于我一生来说,我似乎找不到任何对此的引用。我是SQLAlchemy的新手,所以我确实没有任何经验可以借鉴。 问题答案: 只需在列字段中添加或参数: 我更喜欢列名称。;) 有关列插入/
问题内容: 我是flask和sqlalchemy的新手,我只是开始在flask应用程序上工作,现在我正在使用sqlalchemy。我想知道使用flask-sqlalchemy与sqlalchemy是否可以获得任何显着的好处。 问题答案: 主要功能是与Flask应用程序正确集成-它创建并配置引擎,连接和会话,并将其配置为与Flask应用程序一起使用。 此设置非常复杂,因为我们需要创建作用域会话并根据