sqlite3.OperationalError:接近“X”:语法错误

时间:2011-03-05 12:05:43

标签: python sqlite

此代码:

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()

返回:

  

sqlite3.OperationalError:附近   “primary”:语法错误

为什么?我不明白我做错了什么。我放在那里的值是所有变量btw。

1 个答案:

答案 0 :(得分:9)

您的CREATE TABLE不正确:它没有为第一个(“整数主键”)列指定名称。 SQLite现在认为该字段命名为 integer,并且没有定义数据类型。您可能想要一个INTEGER PRIMARY KEY字段,因为这非常有效。为此,请尊重CREATE TABLE syntax,并为其命名:

CREATE TABLE items
( id INTEGER PRIMARY KEY
, x  DOUBLE
, y  DOUBLE
);

作为旁注:我已经将X和Y定义为双精度,因为指定类型只是一种好习惯,而且效率稍高。当然,如果要将文本放入其中,请将它们定义为TEXT。或者,如果您希望它们主要包含整数,请将它们定义为INTEGER。如果你真的不知道你将在那里投放什么样的数据,那么只留下数据类型。

接下来,由于INSERT statement只需要字段名称(而不是它们的完整定义),因此SQLite会抛出语法错误 - 这是正确的。

最后,你不觉得把'今天'(文本值)放入整数列有点傻吗?!


编辑,因为你说X和Y是变量,也可能会让你正确地将这些变量绑定到SQL语句:

curs.execute("INSERT INTO items (X, Y) VALUES (:X, :Y)", {X: X, Y: Y})

我遗漏了id主键字段,因为如果不存在,SQLite会自动生成该字段。如果要传递显式值,则可以。但请注意它是一个整数,并且它是唯一的!

SQL语句中的:X:Y参数引用作为第二个参数传递给{{1}的字典的XY成员声明。

绑定参数为both safer and faster,而不是将参数包含在SQL字符串本身中。