Как использовать переменную для имени таблицы 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
Другие вопросы по тегам