如何修改SQLAlchemy 1.4关联字段别名格式为{表名}_{字段名}
解决SQLAlchemy 1.4查询关联字段别名格式问题
方法1:显式指定字段别名(推荐,灵活可控)
直接在查询语句中用label()方法给关联字段指定自定义别名,完全匹配{表名}_{字段名}的格式要求:
from sqlalchemy import select import pandas as pd # 假设Process模型与AssetQuality模型通过asset_quality属性关联 stmt = select( Process.id, Process.name, AssetQuality.id.label("asset_quality_id"), AssetQuality.score.label("asset_quality_score") ).join(Process.asset_quality) # 执行ORM查询 results = db.session.execute(stmt).all() # 或用pandas读取结果 df = pd.read_sql(stmt, db.engine)
生成的SQL会将关联字段别名替换为预期格式,比如asset_quality.id AS asset_quality_id,替代原来的asset_quality_1.id AS id_2。
方法2:全局自定义别名生成规则
如果需要所有查询自动应用该别名格式,可以重写PostgreSQL的SQL编译器逻辑,修改默认的别名生成规则:
from sqlalchemy.sql.compiler import SQLCompiler from sqlalchemy.dialects.postgresql import PGCompiler from sqlalchemy.dialects import registry from sqlalchemy import create_engine class CustomPGCompiler(PGCompiler): def _label(self, name, col): # 优先使用表名+字段名作为别名,无表名时回退默认逻辑 if col.table and hasattr(col.table, 'name'): return f"{col.table.name}_{name}" return super()._label(name, col) # 注册自定义方言 registry.register("postgresql.custom", __name__, "CustomPGCompiler") # 使用自定义方言创建数据库引擎 engine = create_engine("postgresql+custom://your_user:your_pass@your_host/your_db")
注意:需确保所有模型的__tablename__属性已正确设置,否则表名可能不符合预期。
方法3:ORM Query对象配合label
如果习惯使用ORM的query()方法,同样可以结合label()指定别名:
from sqlalchemy.orm import load_only import pandas as pd query = db.session.query( Process, AssetQuality.id.label("asset_quality_id"), AssetQuality.score.label("asset_quality_score") ).options(load_only(Process.id, Process.name)).join(Process.asset_quality) results = query.all() df = pd.read_sql(query.statement, db.engine)
内容的提问来源于stack exchange,提问作者aarcas
相关产品推荐
相关产品推荐

