Я реорганизую немного side project, чтобы использовать SQLite вместо структуры данных python, чтобы я мог изучать SQLite. Структура данных, которую я использовал, - это список dicts, где ключи каждого dict представляют свойства элемента меню. В конечном итоге эти ключи должны стать столбцами в таблице SQLite.SQLite: Почему нельзя использовать параметры для установки идентификатора?
Я сначала подумал, что я мог бы создать таблицу программно путем создания таблицы с одной колонкой, итерацию по списку ключей словаря и выполнение ALTER TABLE
, ADD COLUMN
команда так:
# Various import statements and initializations
conn = sqlite3.connect(database_filename)
cursor = conn.cursor()
cursor.execute("CREATE TABLE menu_items (item_id text)")
# Here's the problem:
cursor.executemany("ALTER TABLE menu_items ADD COLUMN ? ?", [(key, type(value)) for key, value in menu_data[0].iteritems()])
После некоторых более чтение, я понял, что параметры не могут использоваться для идентификаторов, только для буквенных значений. PyMOTW on sqlite3
говорит
параметры запроса могут быть использованы с выбрать, вставки и обновление заявления. Они могут отображаться в любой части запроса, где буквальное значение является законным.
Kreibich говорит на с. 135 Использование SQLite (ISBN 9780596521189):
Однако следует отметить, что параметры могут быть использованы только для замены буквенных значения, такие как строк в кавычках или числовых значений. Параметры не могут использоваться вместо идентификаторов, таких как имена таблиц или имена имен . Следующий бит SQL недопустим:
SELECT * FROM ?; -- INCORRECT: Cannot use a parameter as an identifier
Я принимаю, что позиционные или именованные параметры не могут быть использованы таким образом. Почему они не могут? Есть ли какой-то общий принцип, который мне не хватает?
Похожие SO вопрос:
Вы можете найти по протоколу HTTPS://www.sqlite.org/optoverview.html и рассмотрим, как изменение имени столбца влияет на использование индекса и, следовательно, на природу скомпилированного байт-кода. – Duncan