[英]Get and Add WHERE clause in SQL Query Python
我正在用 Python 編碼。 我有這樣的查詢:
SELECT device_os, count(*) FROM warehouse WHERE device_year <= 2016 GROUP BY device_os;
現在,我有一些額外的過濾器,它們是來自用戶動態的。 例如,
device_id IN (15, 85, 65) OR device_model in ('MAX', 'SHARP', 'AD')
我有這些額外的條件,我想應用於查詢。 所以,最終的查詢應該變成:
SELECT device_os, count(*) FROM warehouse WHERE device_year <= 2016 AND (device_id IN (15, 85, 65) OR device_model in ('MAX', 'SHARP', 'AD')) GROUP BY device_os;
我搜索了sqlparse
但沒有成功。 我怎樣才能讓它看起來像我想要的那樣?
將 SQL 定義為模板格式字符串,然后將動態生成的條件代入其中。
sql_format = 'SELECT device_os, count(*) FROM warehouse WHERE device_year <= 2016 AND ({}) GROUP BY device_os;'
where_clause = 'device_id IN (%s, %s, %s) OR device_model in (%s, %s, %s)'
sql = sql_format.format(where_clause)
params = [15, 85, 65, 'MAX', 'SHARP', 'AD']
cursor.execute(sql, params)
如果您沒有任何附加條件,則可以使用
where_clause = '1=1'
這是一個始終為真的條件,因此它不會改變結果。
我制作了一個名為SQLGlot的庫,這使得這很容易。
import sqlglot
import sqlglot.expressions as exp
expression = sqlglot.parse_one("""
SELECT device_os, count(*) FROM warehouse WHERE device_year <= 2016 GROUP BY device_os
""")
def transform(node):
if isinstance(node, exp.Where):
node.args["this"] = sqlglot.parse_one(f"({node.this.sql()}) AND device_model in (1,2,3)")
return node
print(expression.transform(transform).sql(pretty=True))
# output
SELECT
device_os,
COUNT(*)
FROM warehouse
WHERE
(device_year <= 2016)
AND device_model IN (1, 2, 3)
GROUP BY
device_os
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.