python - 使 SQLAlchemy 在连接中使用所需的表
问题描述
我正在编写一个使用多个外连接的查询,并遇到了 SQLAlchemy 选择错误表的问题。
这是我想要的查询 -
SELECT
vocab_term.id,
COALESCE(max(vocab_session_entry.question_level), 0) AS score
FROM
vocab_set
JOIN
vocab_term
on vocab_term.set_id = vocab_set.id
LEFT JOIN
vocab_session
on vocab_session.set_id = vocab_set.id
LEFT JOIN
vocab_session_entry
on vocab_session_entry.session_id = vocab_session.id and vocab_session_entry.term_id = vocab_term.id
WHERE
vocab_set.id = %(id_1)s
AND vocab_session.user_id = %(user_id_1)s
GROUP BY
vocab_set.id, vocab_term.id, vocab_session.user_id;
这是我的 SQLAlchemy 实现:
db.session.query(VocabTerm.id, coalesce(func.max(VocabSessionEntry.question_level)))
.join(VocabTerm, VocabTerm.set_id==VocabSet.id)
.join(VocabSession, VocabSession.set_id==VocabSet.id, isouter=True)
.join(VocabSessionEntry, and_(VocabSessionEntry.session_id, VocabSessionEntry.term_id==VocabTerm.id), isouter=True)
.filter(VocabSet.id==vocab_set_id)
.filter(VocabSession.user_id==user_id)
.group_by(VocabSet.id, VocabTerm.id, VocabSession.user_id)
.all()
这就是我最终得到的结果(由 SQLAlchemy 制作:
SELECT
vocab_term.id AS vocab_term_id,
coalesce(max(vocab_session_entry.question_level)) AS score
FROM
vocab_session_entry
JOIN
vocab_term ON vocab_term.set_id = vocab_set.id
LEFT OUTER JOIN
vocab_session
ON vocab_session.set_id = vocab_set.id
LEFT OUTER JOIN
vocab_session_entry
ON vocab_session_entry.session_id AND vocab_session_entry.term_id = vocab_term.id
WHERE
vocab_set.id = %(id_1)s
AND vocab_session.user_id = %(user_id_1)s
GROUP BY
vocab_set.id, vocab_term.id, vocab_session.user_id]
唯一的区别是 SQLAlchemy 使用 vocab_session_entry 而不是 vocab_set 作为它的 FROM 表。有什么方法可以让 SQLAlchemy 使用 vocab_set 作为 from 表?
解决方案
对于遇到此问题的其他任何人 - 您可以使用 Query.select_from() 显式设置 from 子句。文档
推荐阅读
- reactjs - Ant设计表rowSelection与expandRowRender不兼容
- python - 问题:使用自定义视觉和 python API 下载模型
- javascript - 将对象转换为数组返回未定义
- django - 未找到“user_login”的反向。'user_login' 不是有效的视图函数或模式名称
- python - python3'类型函数不可迭代'tkinter
- git - 如何在三重存储之上设置版本控制
- azure - Jenkins:VM Azure 代理:节点下班后脱机,无法自动重新开始新工作
- angular - FormGroup 中的 nzMode="tags" 将项目添加到 FormArray
- sql-server - 如果条件中的返回语句在 SQL 函数中不起作用
- kubernetes - Helm 模板在绑定到 configmap 时不起作用