簡體   English   中英

SQLAlchemy 查詢將 .filter() 呈現為“WHERE false”

[英]SQLAlchemy query renders .filter() as "WHERE false"

我的問題歸結為以下使用 Python3.8 和 SQLAlchemy1.3 運行的代碼:

subquery = (
    session.query(
        Article.id,
        SubscriberArticle.subscriber_id,
        SubscriberArticle.data,
        SubscriberArticle.is_activated,
    )
    .join(SubscriberArticle)
    .filter(and_(
        SubscriberArticle.subscriber_id == 1234,
        Article.is_activated is True
    ))
    .subquery()
)
query = (
    session.query(
        Article.id,
        Article.name,
        subquery.c.subscriber_id,
        subquery.c.data,
        subquery.c.is_activated,
    )
    .join(subquery, subquery.c.id == Article.id)
)

where子句不是我所期望的,這是我所期望的 SQL 請求:

SELECT
    article.id,
    article.name,
    tmp.subscriber_id,
    tmp.data,
    tmp.is_activated
FROM
    script_pixel
LEFT JOIN
    (
        SELECT
                article.id,
                subscriber_article.subscriber_id,
                subscriber_article.data,
                subscriber_article.is_activated
        FROM
            script_pixel
        LEFT JOIN
            subscriber_script_pixel
        ON
            subscriber_article.script_pixel_id = article.id
        WHERE
            subscriber_article.subscriber_id = 1234
            AND
            article.is_activated = true
    ) as tmp
ON
    tmp.id = article.id;

但是當我做一個print("query", str(query))結果是完全不同的:

SELECT 
  script_pixel.id AS script_pixel_id, 
  script_pixel.name AS script_pixel_name, 
  anon_1.subscriber_id AS anon_1_subscriber_id,
  anon_1.data AS anon_1_data,
  anon_1.is_activated AS anon_1_is_activated 
FROM 
  script_pixel 
  JOIN (
    SELECT 
      script_pixel.id AS id, 
      subscriber_script_pixel.subscriber_id AS subscriber_id, 
      subscriber_script_pixel.data AS data, 
      subscriber_script_pixel.is_activated AS is_activated 
    FROM 
      script_pixel 
      JOIN subscriber_script_pixel ON script_pixel.id = subscriber_script_pixel.script_pixel_id 
    WHERE 
      false
  ) AS anon_1 ON anon_1.id = script_pixel.id

正如您在我的子查詢中看到的那樣,我沒有where子句,而是有一個where false無處不在。

您的問題是Article.is_activated is True ,這不能由 SQLAlchemy 編譯,導致WHERE falseWHERE 1=0

    .filter(and_(
        SubscriberArticle.subscriber_id == 1234,
        Article.is_activated is True
    ))

您可以使用Article.is_activated == True代替。 此外,您實際上並不需要and_函數,因為Query.filter()接受任意數量的條件,並將使用and_為您加入它們。

    .filter(
        SubscriberArticle.subscriber_id == 1234,
        Article.is_activated == True,
    )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM