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

