Именованный параметр python sqlite, содержащий тире

Я пытаюсь вставить запись в базу данных sqlite, используя именованные параметры в python (с модулем sqlite3). Значения, которые я хочу вставить, находятся в словаре, но ключи словаря могут содержать дефисы, например {'request-id': 100, 'year': '2015'}. Я пытаюсь выполнить следующее:

import sqlite3
conn = sqlite3.connect('database.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS requests (request_id text, year text)''')
query = '''INSERT INTO requests (request_id, year) VALUES (:request-id, :year)'''
cursor.execute(query, {'request-id': 100, 'year': '2015'})
conn.commit()
conn.close()

Я получаю эту ошибку во время оператора вставки:

sqlite3.OperationalError: no such column: id

Похоже, тире не очень хорошо воспринимаются в качестве именованных параметров.

Для этого есть много обходных путей, например создание нового словаря, в котором тире в ключах заменяются символами подчеркивания, но я хотел бы знать, могу ли я использовать какую-либо технику экранирования или что-то еще, чтобы избежать этого.

Спасибо за вашу помощь


person Daniele    schedule 28.01.2015    source источник
comment
Ваши column names тоже не совпадают. Это date в create и year в insert.   -  person Prerak Sola    schedule 28.01.2015
comment
Нет, я думаю, id здесь относится к непоследовательному использованию date при создании таблицы и year после этого.   -  person ZdaR    schedule 28.01.2015
comment
Извините, это была ошибка вырезания и вставки, фактическая таблица содержит столбец года. Я отредактировал вопрос соответственно. Спасибо   -  person Daniele    schedule 28.01.2015


Ответы (2)


В документации для sqlite3_bind_* указано, что имена параметров должны состоять из буквенно-цифровых символов, а не указать способ избежать их.

Ваш запрос, вероятно, анализируется как :request - id, т. е. :request минус id, и, поскольку такого столбца id нет, SQLite выдает ошибку.

(Кроме того, как указывает Прерак Сола, вы создаете таблицу со столбцом date, но пытаетесь вставить в столбец year, которого не существует.)

person Colonel Thirty Two    schedule 28.01.2015

Имена параметров SQL не имеют механизма кавычек или экранирования; вы должны использовать те же правила, что и для идентификатора без кавычек.

person CL.    schedule 28.01.2015