SQLAlchemy查询时列名用Python保留字class的解决方案咨询
解决SQLAlchemy中访问名为
class的列的语法错误问题 这个坑我之前踩过!class是Python的关键字,直接用.语法访问table_a.columns.class的时候,Python解释器会把它当成类定义的关键字,自然就抛出语法错误了。既然没法改数据库列名,试试这几个可行的办法:
方法1:用字典索引访问列(最推荐)
SQLAlchemy的ColumnCollection(就是table_a.columns的类型)支持字典式的键访问,直接用字符串作为键来获取目标列就行,完美避开关键字冲突:
import sqlalchemy as db engine = db.create_engine('postgresql://username:password@host:port/db') table_a = db.Table("table_a", db.MetaData(), autoload = True, autoload_with = engine) # 用[]代替.来访问关键字列 query = db.select([table_a.columns.document_num.distinct(), table_a.columns['class']])
这个方法最贴合SQLAlchemy的常规用法,代码也清晰易懂,没有额外的复杂度。
方法2:使用db.text()构造列引用
如果需要更灵活的SQL片段,可以直接用text()函数来指定列名,不过要注意确保查询的表上下文正确:
import sqlalchemy as db engine = db.create_engine('postgresql://username:password@host:port/db') table_a = db.Table("table_a", db.MetaData(), autoload = True, autoload_with = engine) query = db.select( [table_a.columns.document_num.distinct(), db.text('class')] ).select_from(table_a)
这种方式适合需要拼接复杂SQL的场景,但如果查询涉及多表关联,最好给列加上表别名,比如db.text('table_a.class')来避免歧义。
方法3:手动映射表时指定key(仅适用于非autoload场景)
要是你是手动定义表结构而不是自动加载的话,可以在定义列的时候通过key参数给列设置一个非关键字的别名,后续用别名访问:
table_a = db.Table( "table_a", db.MetaData(), db.Column('class', db.String, key='class_col'), # 数据库列名是class,代码中用class_col访问 db.Column('document_num', db.String), # 其他列... ) query = db.select([table_a.columns.document_num.distinct(), table_a.columns.class_col])
不过你当前是用autoload加载表,这个方法暂时用不上,但可以记下来以备后续需要。
内容的提问来源于stack exchange,提问作者agrajag_42
相关产品推荐
相关产品推荐

