Su CREATE TABLE es incorrecta: no especifica un nombre para la primera columna ('clave primaria entera'). SQLite ahora piensa que el campo es llamadointeger
, y no tiene ningún tipo de datos definido. Probablemente querías tener un campo INTEGER PRIMARY KEY, porque es muy eficiente. Para ello, respetar la CREATE TABLE syntax, y darle un nombre:
CREATE TABLE items
(id INTEGER PRIMARY KEY
, x DOUBLE
, y DOUBLE
);
Como nota al margen: He definido X e Y como dobles, ya que especifica el tipo es sólo una buena práctica, y también es un poco más eficiente. Por supuesto, si quiere poner texto en ellos, defínalos como TEXTO. O si desea que contengan principalmente enteros, defínalos como INTEGER. Solo omita el tipo de datos si realmente no sabe qué tipo de datos va a poner allí.
A continuación, dado que INSERT statement solo espera nombres de campo (y no su definición completa), SQLite arroja un error de sintaxis, con razón.
Y, por último, ¿no te parece un poco tonto poner 'hoy' (un valor de texto) en una columna entera?!?
Editar: ya que dices X e Y son variables, puede ser que también le puso en el camino correcto en la unión de esas variables a la instrucción SQL:
curs.execute("INSERT INTO items (X, Y) VALUES (:X, :Y)", {X: X, Y: Y})
he dejado fuera del campo de clave principal id
, ya que SQLite generará automáticamente eso si no está presente. Si quieres pasar un valor explícito, puedes. ¡Pero tenga cuidado de que sea un número entero, y que sea único!
Los :X
y :Y
parámetros de la instrucción SQL se refieren a los X
y Y
miembros del diccionario que se pasa como segundo parámetro a la declaración execute
.
Los parámetros de enlace son both safer and faster que incluir los parámetros en la cadena de SQL en sí.
Los diagramas de sintaxis SQLite "ferrocarriles" son muy útiles, p. http://www.sqlite.org/lang_createtable.html ... el nivel superior está aquí: http://www.sqlite.org/lang.html –