簡體   English   中英

將原始 SQL 轉換為 SQLAlchemy 查詢

[英]Convert raw SQL to SQLAlchemy query

SELECT * 
FROM product_stocks 
WHERE detected_date = (
                         SELECT MAX(detected_date) 
                         FROM product_stocks 
                         WHERE id = 18865
                      ) 
      AND id = 18865;

將其轉換為 SQLAlchemy 查詢字符串時遇到很多麻煩。 最有效的方法是什么?

您可以使用from_statement執行原始 SQL-Query 並在 SQL-Alchemy 對象中獲取它。 當編寫普通 SQL 比編寫 SQLAlchemy 語法更容易時,這會有所幫助。

Session.query(YourClass).from_statement(text('''SELECT * FROM product_stocks 
WHERE detected_date = (SELECT MAX(detected_date) FROM product_stocks WHERE id = 18865)
AND id = 18865;''')).all()

下面將重新創建您要求的 SQL:

_id = 18865
T = aliased(ProductStock, name="T")
T1 = aliased(ProductStock, name="T1")
subquery = (
    session.query(func.max(T1.detected_date).label("detected_date"))
    .filter(T1.id == _id)
    # .filter(T1.id == T.id)  # @note: i prefer this one to the line above
    .as_scalar()
)
qry = (
    session.query(T)
    .filter(T.detected_date == subquery)
    .filter(T.id == _id)
)

這是實現您想要的最有效的方法嗎? - 我不太確定,但沒有足夠的信息

使用核心 SQLAlchemy 1.4/2.0:

from sqlalchemy import text, select, column
sql = 'SELECT foo FROM bar'
sql = text(sql)
sql = sql.columns(column('foo'))  # This let's it be used as a subquery

sel = select(sql.selected_columns.foo).select_from(sql.subquery())

joined = sel.outerjoin(baz_t, baz_t.foo==sel.c.foo)

final = select(sel.c.foo).select_from(joined)

使用核心 SQLAlchemy < 1.4:

sql = 'SELECT foo FROM bar'
sql = text(sql)
sql = sql.columns()  # This let's it be used as a subquery

sel = select(['foo']).select_from(sql)
# I needed this for a complex query or else columns would be ambiguous
sel = sel.alias('sel')  

joined = sel.outerjoin(baz_t, baz_t.foo==sel.c.foo)

final = select([sel.c.foo]).select_from(joined)

請注意, columns()是必需的,如果查詢很復雜,則alias()很有幫助。

以下文本文檔很有幫助。

暫無
暫無

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

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