11

Вопрос по sqlite, python – Подстановка параметров SQLite и кавычки

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

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

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

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

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

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

'Incorrect number of bindings supplied. The current statement uses 0, and there are 1 supplied.'

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

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

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

Использовать параметры здорово, это не только безопаснее, но и намного быстрее. Читайте здесь:<a href="http://stackoverflow.com/questions/904796/how-do-i-get-around-the-problem-in-sqlite-and-c/926251#926251" title="how do i get around the problem in sqlite and c">stackoverflow.com/questions/904796/&#x2026;</a>

Jun 17, 2009, 8:13 AMот

6ответов

10

about "quot;" Если я удалю кавычки, поставленные перед?, это сработает. Но я хочу, чтобы цитаты оставались там, поскольку я помню, что бывают случаи, когда они мне нужны. & Quot; & quot;

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

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

4

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

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

Он воспринимает это как строку «?».

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

18

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

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

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

14

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

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

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

2

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

c.execute('SELECT cleanseq FROM cleanseqs WHERE newID=?', (name,))
0

Regular User

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

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

RelatedQuestions