Подстановка SQLite и кавычки

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

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

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

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

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

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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