How to use Enum with SQLAlchemy and Alembic?(如何将枚举与SQLAlChemy和Alembic一起使用?)
问题描述
这是我的Post模型:
我想将枚举status
添加到其中。因此,我已经创建了一个新的枚举:
并向模型添加了一个新字段:
执行FLASK_APP=server.py flask db migrate
后,生成了这样的迁移:
尝试升级数据库后,我收到:
- 为什么没有在DB级自动创建类型
poststatus
?在类似的迁移中也是如此。 - 如何正确指定
server_default
选项?我既需要ORM级别的默认值,也需要DB级别的默认值,因为我正在更改现有行,所以不应用ORM默认值。 - 为什么数据库中的实值是‘草稿’、‘批准’、‘已发布’,而不是
draft
等?我认为应该有ENUM值,而不是名称。
提前感谢您。
推荐答案
为什么数据库中的实值是‘草稿’、‘批准’、‘发布’,而不是草稿等?我认为应该有ENUM值,而不是名称。
正如Peter BaSQLAlChemical已经提到的,š在数据库中使用枚举名称(草稿、批准、发布)。我认为这是因为枚举值("Draft"、"Approve",.)可以是Python中的任意类型,并且不保证它们是唯一的(除非使用@unique
)。
但是,由于SQLAlChemy 1.2.3类接受一个参数values_callable
,该参数可用于在数据库中存储枚举值:
为什么没有在DB级自动创建类型poststatus?在类似的迁移中也是如此。
我认为基本上您遇到了alembic的限制:在某些情况下,它不能正确处理PostgreSQL上的枚举。我怀疑您的案例中的主要问题是Autogenerate doesn't correctly handle postgresql enums #278。
我注意到如果我使用alembic.op.create_table
可以正确创建类型,因此我的解决方法基本上是:
这篇关于如何将枚举与SQLAlChemy和Alembic一起使用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!