Подстановка 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