Как использовать переменную для имени таблицы SQLite
У меня есть программа, в которой пользователь может выбрать таблицу, которую он хочет изменить в SQLite. Я храню выбор в переменной с именем table
, а затем попробуйте выбрать все из этой таблицы
c.execute('SELECT * FROM ?', (table,))
Программа застревает на вопросительном знаке. Это говорит:
"Sqlite3.OperationalError: near"? ": Синтаксическая ошибка"
Что я делаю неправильно?
1 ответ
Вы не можете использовать подстановку параметров для имени таблицы. Вам нужно добавить имя таблицы в строку запроса самостоятельно. Что-то вроде этого:
query = 'SELECT * FROM {}'.format(table)
c.execute(query)
Следует помнить об источнике значения для имени таблицы. Если это происходит из ненадежного источника, например, от пользователя, вам необходимо проверить имя таблицы, чтобы избежать потенциальных атак SQL-инъекций. Одним из способов может быть создание параметризованного запроса, который ищет имя таблицы из каталога БД:
import sqlite3
def exists_table(db, name):
query = "SELECT 1 FROM sqlite_master WHERE type='table' and name = ?"
return db.execute(query, (name,)).fetchone() is not None