Как использовать переменные в инструкции SQL в Python?



хорошо, так что я не настолько опытен в Python.



у меня есть следующий код на Python:



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


здесь var1 - целое число, var2 & var3 - Это строки.



как я могу написать имена переменных без python, включая их в текст запроса?

5197   4  

4 ответов:

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

обратите внимание, что параметры передаются в виде кортежа.

API базы данных делает правильный экранирование и цитирование переменных. Будьте осторожны, чтобы не использовать оператор форматирования строки (%), поскольку

  1. он не делает никаких побегов или цитирования.
  2. он склонен к неконтролируемым атакам формата строки, например 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

    Ничего не найдено.