簡體   English   中英

如何將參數化的sql查詢放入變量然后在Python中執行?

[英]How to put parameterized sql query into variable and then execute in Python?

我知道在 Python 中格式化 sql 查詢的正確方法是這樣的:

cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3)

以防止sql注入。 我的問題是是否有辦法將查詢放入變量中然后執行它? 我已經嘗試了下面的例子,但收到一個錯誤。 是否有可能做到這一點?

sql="INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3
cursor.execute(sql)

這是cursor.execute的調用簽名:

Definition: cursor.execute(self, query, args=None)

    query -- string, query to execute on server
    args -- optional sequence or mapping, parameters to use with query.

因此,execute最多需要3個參數(args是可選的)。 如果給出了args,則預期它是一個序列。 所以

sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3
cursor.execute(*sql_and_params)

不會起作用,因為

cursor.execute(*sql_and_params)

將元組sql_and_params擴展為4個參數(同樣,執行只需要3個參數)。

如果你真的必須使用

sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3

那么當你把它送到cursor.execute時你就必須把它分開:

cursor.execute(sql_and_params[0],sql_and_params[1:])

但我覺得使用兩個變量感覺更愉快:

sql = "INSERT INTO table VALUES (%s, %s, %s)"
args= var1, var2, var3
cursor.execute(sql, args)

你很親密。

sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3
cursor.execute(*sql_and_params)

星號表示該變量不被視為一個參數,而是被解壓縮為許多參數。

這對我有用。 使用 pyodbc 查詢 Microsoft SQL Server。

cusotmer_list = ['ABC', '123']

# parameterized query placeholders
placeholders = ",".join("?" * len(customer_list))

# query table
query = 
"""
SELECT
[ID],
[Customer]
FROM xyz.dbo.abc
WHERE [Customer] IN (%s)
""" % placeholders

# read query results in pandas dataframe
df = pd.read_sql(sql=query, con=cnxn, params=customer_list)

在python中將參數傳遞給sql查詢的最佳方式是:“INSERT INTO table VALUES (:1, :2, :3)”, [val1, val2, val3]

或另一個例子:

"更新表 T SET T.column2 = :1 where T.column1= :2 ", [val1,val2]

暫無
暫無

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

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