2011-03-05 20 views
5

este código:sqlite3.OperationalError: cerca de "X": error de sintaxis

conn = connect('emails.db') 
curs = conn.cursor() 

curs.execute('''create table items 
    (integer primary key, X, Y)''') 

curs.execute("INSERT INTO items (integer primary key, X, Y) VALUES ('today', 'X', 'Y')") 

connection.commit() 

rendimientos:

sqlite3.OperationalError: near "primary": syntax error

¿Por qué? No veo lo que estoy haciendo mal. Los valores que estoy poniendo allí son todas las variables por cierto.

+1

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 –

Respuesta

9

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í.

+0

Do: X y: ¿Y trabaja en el controlador sqlite3 python? El único parámetro de reemplazo que está documentado es '?'. – SilverbackNet

+1

@SilverbackNet: lo hacen, también de acuerdo con [este comentario] (http://stackoverflow.com/a/1010804/60590) – Martijn

+0

¡Gracias! Eso agrega un poco de flexibilidad que pensé que había perdido cuando comencé a usar SQLite. – SilverbackNet

Cuestiones relacionadas