使用Flask-SQLAlchemy在Alembic迁移自动生成中未检测到任何更改

偏序

我很难让Alembic使用db.Model(Flask-SQLAlchemy)而不是自动生成从更改到类的候选迁移Base

我已经进行了修改,env.py以创建我的Flask应用,导入所有相关模型,初始化数据库,然后运行迁移:

...
uri = 'mysql://user:password@host/dbname?charset=utf8'
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = uri
app.config['SQLALCHEMY_ECHO'] = True
db.init_app(app)
with app.test_request_context():
    target_metadata = db.Model.metadata
    config.set_main_option('sqlalchemy.url', uri)
    if context.is_offline_mode():
        run_migrations_offline()
    else:
        run_migrations_online()
...

这种方法适用于drop_all()create_all()(例如,在重新创建用于单元测试的测试数据库时),但是在这种情况下,它似乎无法实现。自动生成的版本脚本始终具有空的升级和降级方法,例如

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与Flask-SQLAlchemy结合使用吗?知道我哪里出错了吗?

非常感谢!

米格尔

Alembic无法自动检测表或列的重命名。默认情况下,它也不会查找列类型更改,但是compare_type可以为此启用选项。

摘自Alembic文档:

默认情况下,自动生成将检测:

  • 表的添加,删除。
  • 列的添加,删除。
  • 列上可为空状态的更改。

自动生成可以选择检测:

  • 更改列类型。如果设置为compare_type=True则会发生这种情况EnvironmentContext.configure()该功能在大多数情况下均可正常运行,但默认情况下处于禁用状态,因此可以首先在目标架构上对其进行测试。也可以通过在此处传递可调用对象进行自定义;有关详细信息,请参见该功能的文档。
  • 更改服务器默认值。如果设置为compare_server_default=True则会发生这种情况EnvironmentContext.configure()此功能在简单情况下效果很好,但不能始终产生准确的结果。Postgresql后端实际上将针对数据库调用“检测到的”和“元数据”值以确定等效性。该功能默认情况下处于禁用状态,因此可以先在目标架构上对其进行测试。像类型比较一样,它也可以通过传递可调用对象进行自定义;有关详细信息,请参见该功能的文档。

自动生成无法检测到:

  • 更改表名。这些将作为两个不同表的添加/删除出现,而应手动编辑为名称更改。
  • 列名的更改。像表名称更改一样,它们被检测为列添加/删除对,这与名称更改完全不同。
  • 特殊的SQLAlchemy类型,例如Enum在不ENUM直接支持的后端上生成的-这是因为这种类型在非支持数据库中的表示形式(即CHAR+CHECK约束)可以是任何类型CHAR+CHECK对于SQLAlchemy来说,确定这实际上ENUM只是一个猜测,这通常是一个坏主意。要在此处实现自己的“猜测”功能,请使用该sqlalchemy.events.DDLEvents.column_reflect()事件来更改为某些列传递的SQLAlchemy类型,并可能sqlalchemy.events.DDLEvents.after_parent_attach()拦截不需要的CHECK约束。

自动生成当前无法执行,但最终会检测到:

  • 落地约束添加,删除,像CHECKUNIQUEFOREIGN KEY-这些都还没有实现。现在你会得到内新表,PK和FK约束约束的“降级”到先前存在的表,以及CHECK与SQLAlchemy的“模式”类型产生的约束BooleanEnum
  • 索引添加,删除-尚未实施。
  • 序列添加,删除-尚未实施。

更新:此最后一个列表中的某些项目在Alembic 0.7.x发行版中受支持。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Alembic自动生成空的Flask-SQLAlchemy迁移

来自分类Dev

Alembic自动生成获取Flask-SQLAlchemy绑定的元数据

来自分类Dev

Flask-migrate未检测到架构更改

来自分类Dev

使用sqlalchemy_utils ChoiceType在Flask中迁移时出错

来自分类Dev

Flask未检测到URL中的尾部反斜杠

来自分类Dev

ANSI-任务中未检测到任何操作

来自分类Dev

在 Flask 中,如何使用 thwart?

来自分类Dev

有关使用Flask + MySQL + Flask-SQLAlchemy的问题

来自分类Dev

蓝牙未检测到任何设备

来自分类Dev

使用VBA在Excel中检测到未保存的更改时,设置单元格的值

来自分类Dev

使用FLASK中的POST方法更改值?

来自分类Dev

使用Flask-WTF / WTForms在Flask中添加取消按钮

来自分类Dev

如何在flask中使用openssl(在“Flask Web Development”中)

来自分类Dev

如何使用flask mongoengine处理ReferenceField迁移?

来自分类Dev

将Mixer与Flask-SQLAlchemy结合使用

来自分类Dev

使用Flask-SQLAlchemy选择多对多

来自分类Dev

使用Flask-SQLAlchemy批量插入

来自分类Dev

在Flask SqlAlchemy查询中使用to_char

来自分类Dev

Flask SQLAlchemy使用动态列名添加行

来自分类Dev

使用Flask-SQLAlchemy创建基本表

来自分类Dev

使用 Flask SQLAlchemy 更新特定行

来自分类Dev

无法使用 Flask 和 SQLAlchemy 插入行

来自分类Dev

使用 Flask、Jquery、Javascript、MySQL 自动完成

来自分类Dev

未使用Flask JWT扩展设置Cookie

来自分类Dev

未使用 ajax 请求设置 Flask cookie

来自分类Dev

使用 sqlalchemy_utils ChoiceType 在 Flask 中迁移和升级时出错

来自分类Dev

使用蓝图为Flask动态生成路线

来自分类Dev

使用Flask生成Word文档吗?

来自分类Dev

使用Flask数据生成Javascript。馊主意?

Related 相关文章

热门标签

归档