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

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

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

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

где var1 является целым числом, var2 & var3 являются строками.

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

66 голосов | спросил user111606 24 Mayam09 2009, 00:20:33

4 ответа


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

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

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

  1. он не делает экранирования или цитирования.
  2. он подвержен атакам неконтролируемого строкового формата, например SQL-инъекция .
ответил Ayman Hourieh 24 Mayam09 2009, 00:25:24
0

Разным реализациям 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 в используемом модуле API-интерфейса БД и найдите параметр типа в http://www.python.org/dev/peps/pep-0249/, чтобы увидеть, что все параметры- Стили прохождения есть!

ответил Alex Martelli 24 Mayam09 2009, 05:14:23
0

Много способов. НЕ используйте наиболее очевидный вариант (%s с %) в реальном коде он открыт для атак .

Здесь скопируйте и вставьте из 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))
ответил Kashyap 12 FebruaryEurope/MoscowbWed, 12 Feb 2014 21:16:52 +0400000000pmWed, 12 Feb 2014 21:16:52 +040014 2014, 21:16:52
0

http://www.amk.ca/python/writing/DB- API.html

Будьте осторожны, когда просто добавляете значения переменных в свои операторы: Представьте, что пользователь называет себя ';DROP TABLE Users;' - Вот почему вам нужно использовать sql escaping, который Python предоставляет вам, когда вы используете cursor.execute достойным образом. Пример в URL-адресе:

cursor.execute("insert into Attendees values (?, ?, ?)", (name,
seminar, paid) )
ответил Numlock 24 Mayam09 2009, 00:28:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132