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

如何使SQLAlchemy中首尾带双下划线的列名正常生效?

问题解决:SQLAlchemy中首尾带双下划线的列无法生成

问题原因

SQLAlchemy的声明式基类(declarative_base)会默认忽略类中首尾带有双下划线的属性,因为这类命名属于ORM框架的保留命名规则(比如__tablename__就是ORM用来指定表名的特殊属性),框架会自动过滤这类属性,不会将其映射为数据库表的列。

解决方案

要强制让这类列正常生成,只需在定义Column时,通过name参数显式指定数据库中的列名即可:

修改后的代码

from os import environ

from sqlalchemy import Boolean, Column, Identity, Integer
from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base

Base = declarative_base()

class Tbl(Base):
    __tablename__ = 'Tbl'
    # 显式指定列名,与类属性名保持一致
    __has_error__ = Column(Boolean, name='__has_error__')
    id = Column(Integer, primary_key=True, server_default=Identity())

engine = create_engine(environ["RDBMS_URI"])
Base.metadata.create_all(engine)

验证结果

执行代码后查看数据库表,会发现__has_error__列已正常生成:

=> \d "Tbl"
                             Table "public.Tbl"
    Column     |  Type   | Collation | Nullable |             Default              
---------------+---------+-----------+----------+----------------------------------
 id            | integer |           | not null | generated by default as identity
 __has_error__ | boolean |           |          | 
Indexes:
    "Tbl_pkey" PRIMARY KEY, btree (id)

补充说明

如果不想在数据库中使用带双下划线的列名,也可以通过name参数指定其他合法列名,比如:

__has_error__ = Column(Boolean, name='has_error')

这样类中使用__has_error__属性,数据库中对应的列名是has_error,同样能避开ORM的保留命名过滤逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 02:02:20