<blockquote>
<p>Why real values in DB are 'DRAFT', 'APPROVE', 'PUBLISHED', but not draft, etc? I supposed there should be ENUM values, not names.</p>
</blockquote>
<p>正如peterbašista已经提到的那样,SQLAlchemy在数据库中使用<strong>枚举名称</strong>(DRAFT、APPROVE、PUBLISHED)。我假设这样做是因为枚举值(“draft”、“approve”、…)可以是Python中的任意类型,并且不能保证它们是唯一的(除非使用<code>@unique</code>)。在</p>
<p>然而,由于SQLAlchemy 1.2.3</strong>,因此<code>Enum</code>类接受一个参数<code>values_callable</code>,该参数可用于在数据库中存储<strong>枚举值</strong>:</p>
<pre><code> status = db.Column(
db.Enum(PostStatus, values_callable=lambda obj: [e.value for e in obj]),
nullable=False,
default=PostStatus.DRAFT.value,
server_default=PostStatus.DRAFT.value
)
</code></pre>
<blockquote>
<p>Why type poststatus was not created on DB-level automatically? In the similar migration it was.</p>
</blockquote>
<p>我认为基本上你遇到了alembic的一个限制:在某些情况下,它不能正确地处理PostgreSQL上的枚举。我怀疑你的案子的主要问题是<a href="https://github.com/sqlalchemy/alembic/issues/278" rel="nofollow noreferrer">Autogenerate doesn't correctly handle postgresql enums #278</a>。在</p>
<p>我注意到,如果我使用<code>alembic.op.create_table</code>创建的类型是正确的,所以我的解决方法基本上是:</p>
^{pr2}$