Стандартным подходом к использованию значений переменных в запросах SQLite является "стиль метки вопроса", например:
import sqlite3
with sqlite3.connect(":memory:") as connection:
connection.execute("CREATE TABLE foo(bar)")
connection.execute("INSERT INTO foo(bar) VALUES (?)", ("cow",))
print(list(connection.execute("SELECT * from foo")))
# prints [(u'cow',)]
Однако это работает только для подстановки значений в запросы. Он не работает при именах таблиц или столбцов:
import sqlite3
with sqlite3.connect(":memory:") as connection:
connection.execute("CREATE TABLE foo(?)", ("bar",))
# raises sqlite3.OperationalError: near "?": syntax error
Ни в модуле sqlite3
, ни PEP 249 не упоминается функция для экранирования имен или значений. Предположительно, это препятствует пользователям собирать свои запросы со строками, но это оставляет меня в недоумении.
Какая функция или метод наиболее подходят для использования имен переменных для столбцов или таблиц в SQLite? Я бы предпочел сделать это без каких-либо других зависимостей, так как я буду использовать его в своей собственной оболочке.
Я искал, но не смог найти четкое и полное описание соответствующей части синтаксиса SQLite, чтобы использовать для написания моей собственной функции. Я хочу быть уверенным, что это будет работать для любого идентификатора, разрешенного SQLite, поэтому решение для проб и ошибок слишком неопределенно для меня.
SQLite использует "
для цитирования идентификаторов, но я не уверен, что достаточно просто избежать их. Документация по функциям PHP sqlite_escape_string
предполагает, что некоторые двоичные данные также могут быть экранированы, но это может быть причудой библиотеки PHP.