Как поместить параметризованный SQL-запрос в переменную, а затем выполнить в Python? - PullRequest
7 голосов
/ 27 октября 2009

Я понимаю, что правильный способ форматирования SQL-запроса в Python выглядит так:

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)

Ответы [ 3 ]

14 голосов
/ 27 октября 2009

Вот подпись вызова для 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 аргумента (аргументы необязательны). Если аргументы заданы, ожидается, что это будет последовательность. так

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)
4 голосов
/ 27 октября 2009

Ты довольно близко.

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

Звездочка означает, что переменная не должна рассматриваться как один параметр, а распакована во многие параметры.

0 голосов
/ 27 октября 2009

Вы можете попробовать это:

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

Но я не уверен, что это то, что вы ищете. Это зависит от того, хотите ли вы значения как часть переменной или нет. Если да, ответ Антса Аасма, вероятно, правильный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...