Подстановка параметров SQLite и кавычки - PullRequest
11 голосов
/ 17 июня 2009

У меня есть эта строка, которая работает нормально:

c.execute('select cleanseq from cleanseqs WHERE newID="%s"'%name)

Но я хочу использовать подстановку параметров SQLite вместо подстановки строк (потому что я вижу здесь , что это безопаснее).

Это моя (неудачная) попытка:

t = (name,)
c.execute('select cleanseq from cleanseqs WHERE newID="?"',t)

Но эта строка возвращает:

'Неверное количество привязок в комплект поставки. Текущий оператор использует 0, и поставляются 1. '

Так что левая часть моего утверждения не работает. Я предоставляю одну привязку (имя, в т), но кажется, что вопросительный знак (?) Не анализируется. Если я удаляю кавычки, оканчивающиеся на?, Это работает. Но я хочу, чтобы цитаты оставались там, так как я помню, что есть случаи, когда они мне нужны.

Итак, вопрос: как мне преобразовать эту строку:

c.execute('select cleanseq from cleanseqs WHERE newID="%s"'%name)

Ответы [ 6 ]

19 голосов
/ 22 мая 2014

Любой, кто, как я, нашел эту ветку и был очень расстроен людьми, игнорирующими тот факт, что иногда вы не можете просто игнорировать кавычки (потому что вы используете, скажем, команду LIKE), вы можете исправить это, выполнив что-то эффект:

var = name + "%"
c.execute('SELECT foo FROM bar WHERE name LIKE ?',(var,))

Это позволит вам в этой ситуации заменить символами подстановки.

14 голосов
/ 18 июня 2009

Я нахожу стиль привязки именованных параметров гораздо более читабельным - и sqlite3 поддерживает его:

c.execute('SELECT cleanseq FROM cleanseqs WHERE newID=:t', locals())

Примечание: передача {'t': t} или dict(t=t) вместо locals() была бы более точной, но, на мой взгляд, это помешало бы читабельности при наличии нескольких параметров и / или более длинных имен. В любом случае, я считаю :t лучше, чем ?; -).

10 голосов
/ 17 июня 2009

about "" "Если я удаляю кавычки, оканчивающиеся на?, Это работает. Но я хочу, чтобы кавычки оставались там, так как я помню, что есть случаи, когда они мне нужны." ""

То, что вы помните, когда сами создавали оператор SQL, не имеет значения.

Новая история: пометить? каждое место в выражении SQL, где вы хотите заменить значение, затем передать кортеж, содержащий одно значение на? -- это так просто; оболочка будет заключать в кавычки любые строки, чтобы убедиться, что они являются приемлемыми константами SQL.

4 голосов
/ 17 июня 2009

Потерять цитаты вокруг?

c.execute('select cleanseq from cleanseqs WHERE newID=?',(t,))

Это трактуется как строка "?".

Вам нужно использовать двойные кавычки вокруг всего выражения вместо одиночных?

2 голосов
/ 17 июня 2009

Библиотека будет обрабатывать цитирование и экранирование для вас. Просто напишите ваш запрос так:

c.execute('SELECT cleanseq FROM cleanseqs WHERE newID=?', (name,))
0 голосов
/ 21 ноября 2016

Обычный пользователь

только что заметил, что вам придется делать это руководство, используя небезопасный метод sql_string = "other sql surger here .. fieldname = \" "+ value +" \ ";"

это единственный способ, чтобы вы правильно его проанализировали. используя SQLite для win ce. и, конечно же, у меня не осталось другой альтернативы, просто экранируйте свои значения, прежде чем вводить их, иначе вы, скорее всего, получите очень печальную базу данных из SQL-инъекций: '(lol

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...