如何在SQLAlchemy查询中移除列的表名及别名以保留原命名
解决SQLAlchemy查询生成冗余表前缀和别名的问题
问题分析
你的问题源于表定义时将schema和表名合并写在了__tablename__中,导致SQLAlchemy把gold.user当作完整表名处理,自动给列添加表全名前缀并生成别名;同时默认查询逻辑会自动为列生成别名以避免冲突。
解决方案
方案1:修正表定义(推荐)
将schema和表名分开配置,让SQLAlchemy正确识别数据库schema和表名:
class User(Base): __tablename__ = "user" # 仅指定表名 __table_args__ = {"schema": "gold", "quote": False} # 单独指定schema user = Column("user", String, primary_key=True)
此时执行原查询代码:
session.query(User.user).limit(1)
生成的SQL会符合预期:
SELECT user FROM gold.user LIMIT 1
方案2:直接指定原始列名查询
如果无法修改表定义,可以使用literal_column直接指定要查询的列名,绕过ORM自动添加的前缀和别名:
from sqlalchemy import literal_column # 使用literal_column指定列名,并通过select_from指定查询表 session.query(literal_column('user')).select_from(User).limit(1)
这条语句会直接生成你需要的SQL:
SELECT user FROM gold.user LIMIT 1
内容的提问来源于stack exchange,提问作者GGS
相关产品推荐
相关产品推荐

