как безопасно генерировать оператор SQL LIKE с помощью python db-api
Я пытаюсь собрать следующий оператор SQL, используя db-api python:
SELECT x FROM myTable WHERE x LIKE 'BEGINNING_OF_STRING%';
где BEGINNING_OF_STRING должен быть python var для безопасного заполнения через DB-API. Я пытался!--3-->
beginningOfString = 'abc'
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%', beginningOfString)
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%%', beginningOfString)
у меня нет идей; как правильно это сделать?
3 ответов
лучше всего отделить параметры от sql, если вы можете. Затем вы можете позволить модулю db позаботиться о правильном цитировании параметров.
sql='SELECT x FROM myTable WHERE x LIKE %s'
args=[beginningOfString+'%']
cursor.execute(sql,args)
EDIT:
Как отметили Брайан и Томас,далеко лучший способ сделать это - использовать:
beginningOfString += '%'
cursor.execute("SELECT x FROM myTable WHERE x LIKE ?", (beginningOfString,) )
поскольку первый метод оставляет вас открытыми для атак SQL-инъекций.
осталось в истории:
попробуй:
cursor.execute("SELECT x FROM myTable WHERE x LIKE '%s%%'" % beginningOfString)
обратите внимание и sqlite3 документы:
обычно для ваших операций SQL потребуется использовать значения из переменных Python. Вы не должны собирать свой запрос использование строковых операций Python потому что это небезопасно; это делает ваша программа уязвима для SQL такая атака.
вместо этого используйте параметр DB-API замена. Поставить ? в качестве заполнителя везде, где вы хотите использовать значение, и затем кортеж значения второй аргумент курсора метод EXECUTE. (Другая база данных модули могут использовать другое заполнитель, например %s или: 1.) Для пример:
# Never do this -- insecure! symbol = 'IBM' c.execute("... where symbol = '%s'" % symbol) # Do this instead t = (symbol,) c.execute('select * from stocks where symbol=?', t) # Larger example for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00), ('2006-04-06', 'SELL', 'IBM', 500, 53.00), ]: c.execute('insert into stocks values (?,?,?,?,?)', t)
Я думаю, вы хотите этого:
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%?%', (beginningOfString,) )