Ваш CREATE TABLE неверен: он не указывает имя для первого («целочисленный первичный ключ») столбца. Теперь SQLite считает, что поле имеет имя с именем integer
и тип данных не определен. Вы, вероятно, хотели иметь поле INTEGER PRIMARY KEY, потому что это очень эффективно. Для этого соблюдайте синтаксис CREATE TABLE и присвойте ему имя:
CREATE TABLE items
( id INTEGER PRIMARY KEY
, x DOUBLE
, y DOUBLE
);
В качестве примечания: я определила X и Y как двойные, поскольку указание типа является хорошей практикой, а также немного более эффективным. Конечно, если вы хотите поместить текст в них, определите их как ТЕКСТ. Или, если вы хотите, чтобы они содержали в основном целые числа, определите их как INTEGER. Только не указывайте тип данных, если вы действительно не знаете, какие данные вы будете там вводить.
Далее, поскольку оператор INSERT ожидает только имена полей (а не их полное определение), SQLite выдает синтаксическую ошибку - правильно.
И, наконец, не кажется ли вам глупым помещать слово «сегодня» (текстовое значение) в целочисленный столбец?!?
Редактировать: , поскольку вы говорите, что X и Y являются переменными, с тем же успехом вы могли бы связать эти переменные с оператором SQL:
curs.execute("INSERT INTO items (X, Y) VALUES (:X, :Y)", {X: X, Y: Y})
Я пропустил поле первичного ключа id
, поскольку SQLite автоматически сгенерирует его, если его не будет. Если вы хотите передать явное значение, вы можете. Но позаботьтесь о том, чтобы оно было целым и уникальным!
Параметры :X
и :Y
в операторе SQL относятся к X
и Y
членам словаря, который передается в качестве второго параметра в оператор execute
.
Параметры привязки и безопаснее, и быстрее , чем включение параметров в саму строку SQL.