将自连接SQL查询转换为带alias的SQLAlchemy ORM语句时出错求助
报错原因
sqlalchemy.exc.InvalidRequestError: Don't know how to join to <AliasedInsp at 0x7fa9c5832be0; Task(Task)>. Please use the .select_from() method to establish an explicit left side, as well as providing an explicit ON clause if not present already to help resolve the ambiguity.
这个报错核心触发点有三个:
join(table_a, table_b)用法不符合SQLAlchemy规范:join()单次只能声明一次关联关系,同时传入两个别名会导致系统无法识别关联的左表基准、以及哪个是要关联的右表- 关联条件没有和join绑定,你把
table_b.group_id == table_a.group_id放到了外层filter里,系统无法识别这是join的on条件 - 你要查询的是
t2.*,对应第二个别名的字段,query(Task)会默认以原表为查询基准,和自连接的别名逻辑冲突
正确的SQLAlchemy写法
table_a = aliased(Task) # 对应SQL里的t1 table_b = aliased(Task) # 对应SQL里的t2 query = ( self.db.query(table_b) # 要查t2的所有字段,直接指定查询table_b .select_from(table_a) # 显式指定左表为t1 .join(table_b, table_a.g_id == table_b.g_id) # 关联右表t2,同时声明on条件 .filter(table_a.id == task_id) # 过滤t1的id条件 )
如果你的Task模型里的分组字段命名为group_id而非SQL里的g_id,把关联条件里的字段名替换为group_id即可。
内容的提问来源于stack exchange,提问作者Dee
相关产品推荐
相关产品推荐

