【问题标题】:Make SQLAlchemy use desired table in join使 SQLAlchemy 在连接中使用所需的表
【发布时间】:2019-08-31 03:25:32
【问题描述】:

我正在编写一个使用多个外连接的查询,并遇到了 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 表?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    对于遇到此问题的任何其他人 - 您可以使用 Query.select_from() 显式设置 from 子句。 Docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-01
      • 2018-06-18
      • 2016-06-24
      • 2015-12-16
      • 1970-01-01
      • 2018-03-02
      • 2015-02-02
      • 2015-10-26
      相关资源
      最近更新 更多