簡體   English   中英

在 SQL 查詢 Python 中獲取和添加 WHERE 子句

[英]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.

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