You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Alembic与SQLAlchemy设置Server Default迁移报错求助

PostgreSQL + Alembic迁移:DEFAULT表达式列引用报错问题

问题场景

定义表结构如下(省略部分列):

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
import sqlmodel

op.create_table('global_evg_report_history',
    sa.Column('issue_status', sa.String(), server_default=sa.text('wrongly_closed'), nullable=True),
    sa.PrimaryKeyConstraint('plada_service_alias', 'run_date', 'technology_version'),
    sa.UniqueConstraint('plada_service_alias', 'technology_version', 'issue_id', 'run_date')
)

执行Alembic迁移时触发错误:

sqlalchemy.exc.NotSupportedError: (psycopg2.errors.FeatureNotSupported) cannot use column reference in DEFAULT expression
issue_status VARCHAR DEFAULT wrongly_closed,

尝试用双引号包裹后问题仍存在。

原因分析

sa.text('wrongly_closed')会被PostgreSQL当作列名解析,而非字符串常量,而PostgreSQL不允许在DEFAULT表达式中直接引用列,因此报错。

解决办法

需要把默认值明确标记为字符串常量,有两种写法:

写法1:使用sa.text并嵌套单引号

sa.Column('issue_status', sa.String(), server_default=sa.text("'wrongly_closed'"), nullable=True)

写法2:直接指定字符串(无需sa.text)

sa.Column('issue_status', sa.String(), server_default="'wrongly_closed'", nullable=True)

修改后的完整表创建代码:

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
import sqlmodel

op.create_table('global_evg_report_history',
    sa.Column('issue_status', sa.String(), server_default=sa.text("'wrongly_closed'"), nullable=True),
    sa.PrimaryKeyConstraint('plada_service_alias', 'run_date', 'technology_version'),
    sa.UniqueConstraint('plada_service_alias', 'technology_version', 'issue_id', 'run_date')
)

内容的提问来源于stack exchange,提问作者moth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:25:03