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
相关产品推荐
相关产品推荐

