Как использовать переменные в инструкции SQL в Python?
хорошо, так что я не настолько опытен в Python.
у меня есть следующий код на Python:
cursor.execute("INSERT INTO table VALUES var1, var2, var3,")
здесь var1 - целое число, var2 & var3 - Это строки.
как я могу написать имена переменных без python, включая их в текст запроса?
4 ответов:
cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))обратите внимание, что параметры передаются в виде кортежа.
API базы данных делает правильный экранирование и цитирование переменных. Будьте осторожны, чтобы не использовать оператор форматирования строки (
%), поскольку
- он не делает никаких побегов или цитирования.
- он склонен к неконтролируемым атакам формата строки, например SQL-инъекций.
различные реализации 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 вместо карты в качестве второго аргументаexecute). Проверьтеparamstyleстрока константа в модуле DB API, который вы используете, и ищите paramstyle в http://www.python.org/dev/peps/pep-0249/ чтобы увидеть, что все стили передачи параметров!
многими способами. НЕ используйте самый очевидный (
%sС%) в реальном коде, он открыт для ударов.здесь copy-paste'D от pydoc sqlite3:
# Never do this -- insecure! symbol = 'RHAT' c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol) # Do this instead t = ('RHAT',) c.execute('SELECT * FROM stocks WHERE symbol=?', t) print c.fetchone() # Larger example that inserts many records at a time purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00), ('2006-04-06', 'SELL', 'IBM', 500, 53.00), ] c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)больше примеров, Если вам нужно:
# 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))
http://www.amk.ca/python/writing/DB-API.html
будьте осторожны, когда вы просто добавляете значения переменных в свои операторы: Представьте себе, что пользователь называет себя
';DROP TABLE Users;'-- Вот почему вам нужно использовать SQL escaping,который Python предоставляет вам при использовании курсора.выполняем в достойной манере. Пример url-адреса:cursor.execute("insert into Attendees values (?, ?, ?)", (name, seminar, paid) )
Comments