我很难让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约束。
自动生成当前无法执行,但最终会检测到:
落地约束添加,删除,像CHECK,UNIQUE,FOREIGN KEY
-这些都还没有实现。现在你会得到内新表,PK和FK约束约束的“降级”到先前存在的表,以及CHECK与SQLAlchemy的“模式”类型产生的约束Boolean,Enum
。
问题内容: 我正在使用Alembic处理Flask的迁移。理论上,应该基于数据库中的更改自动生成迁移。但是,Alembic仅使用上述命令即可生成空白迁移。 有一个与此问题非常相似的问题,即问题是没有导入正确的模型。但是,我已经从我的Flask应用程序导入了模型,如下所示: 以及中导入的数据库元数据env.py(“ start”是我的Flask应用程序主文件的名称): 运行,alembic revi
我正在尝试创建一个迁移,alembic正在运行,但是我得到了一个错误: 失败:无法继续使用--autogenerate选项;环境脚本/Users/paul/python/my_project/alembic/env。py不向上下文提供元数据对象或对象序列。 我不知道为什么我得到这个错误,因为我已经在env.py文件中设置了target_metadata,并将文件夹添加到路径中。我尝试从我的另一个项
我有一个项目,我在模型中使用SQLAlchemy,并尝试集成Alembic进行迁移。当我更改模型时,一切都按预期进行,Alembic看到模型已经更改- 但是当我没有改变模型中的任何东西并且我使用相同的命令时: 修订版给我“空”修订版文件,如下所示: 这个文件的目的是什么?当alembic revision--autogenerate看不到任何更改时,我可以阻止创建这个“空文件”吗?要比较使用Dja
问题内容: 我有一个Webapp,允许用户创建自己的字段,以供以后使用表单呈现。 我有一个像这样的Formfield模型: 我用来代表字段的类型,无论是哪种类型(复选框,输入,以后都会有更多)。 如你所见,每个字段都有一个form_id的FK。 我正在尝试为给定的form_id生成动态表单。问题是我需要确定要为每个Formfield呈现的字段的类型。因此,我还需要在某个时候处理字段类型。 我想一个
问题内容: 是的,在您将我指向他们之前,我已经回顾了有关该主题的六篇文章,但是我仍然对为什么这行不通感到困惑。 我的目标是检测自动填充何时产生0个结果。这是代码: 搜索本身工作正常,我可以毫无问题地显示结果。据我了解,我 应该 能够使用autocomplete(“ result”)处理程序拦截结果。在这种情况下,它根本不会触发。(即使不引用结果数量的通用警报或console.log也不会触发)。打
问题内容: 如何设置初始化我的Flask应用程序以将Flask-SQLAlchemy设置为自动提交模式,除非我明确地不使用事务? 会话“ 开始通信后即开始数据库事务 ”。这是否会影响Postgres的难度比MySQL? 通过Instagram, 自动提交模式;在这种模式下,Psycopg2不会对任何查询发出BEGIN / COMMIT;相反,每个查询都在其自己的单语句事务中运行。这对于不需要事务语