Как использовать переменные в инструкции SQL в Python?
У меня есть следующий код Python:
cursor.execute("INSERT INTO table VALUES var1, var2, var3,")
где var1 - целое число, var2 а var3 - строки.
Как я могу написать имена переменных без того, чтобы Python включал их как часть текста запроса?
Переведено автоматически
Ответ 1
cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))
Обратите внимание, что параметры передаются в виде кортежа, (a, b, c). Если вы передаете один параметр, кортеж должен заканчиваться запятой, (a,).
API базы данных выполняет правильное экранирование и кавычки переменных. Будьте осторожны и не используйте оператор форматирования строки (%), потому что
Он не выполняет никаких экранирований или кавычек.
Он подвержен неконтролируемым атакам в формате строки, например, SQL-инъекции.
Ответ 2
Разным реализациям Python DB-API разрешено использовать разные заполнители, поэтому вам нужно будет выяснить, какой из них вы используете - это может быть (например, с MySQLdb):
cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))
или (например, с помощью sqlite3 из стандартной библиотеки Python):
cursor.execute("INSERT INTO table VALUES (?, ?, ?)", (var1, var2, var3))
или еще другие (после того, как VALUES у вас могли бы быть (:1, :2, :3) , или "именованные стили", (:fee, :fie, :fo) или (%(fee)s, %(fie)s, %(fo)s) где вы передаете dict вместо map в качестве второго аргумента execute). Проверьте paramstyle строковую константу в используемом вами модуле DB API и найдите paramstyle по адресу http://www.python.org/dev/peps/pep-0249 /, чтобы увидеть, каковы все стили передачи параметров!
Ответ 3
Много способов. НЕ используйте самый очевидный (%s with %) в реальном коде, он открыт для атак.
... остерегайтесь использования строковых операций Python для сборки запросов, поскольку они уязвимы для атак с использованием SQL-инъекций. Например, злоумышленник может просто заключить одинарную кавычку и ввести ИЛИ TRUE для выбора всех строк:
# Never do this -- insecure! symbol = input()
sql = "SELECT * FROM stocks WHERE symbol = '%s'" % symbol print(sql)
cur.execute(sql)
Дополнительные примеры, если вам нужно:
# Multiple values single statement/execution c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO')) print c.fetchall() c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO')) print c.fetchall() # This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice. c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO') print c.fetchall() # Insert a single item c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
Будьте осторожны, когда вы просто добавляете значения переменных к своим операторам: представьте, что пользователь называет себя ';DROP TABLE Users;' - вот почему вам нужно использовать экранирование SQL, которое Python предоставляет вам, когда вы используете cursor.execute приличным образом. Пример в URL-адресе:
cursor.execute("insert into Attendees values (?, ?, ?)", (name, seminar, paid))