sqlite3.OperationalError:接近"X":语法错误

Han*_*ood 4 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()
Run Code Online (Sandbox Code Playgroud)

收益:

sqlite3.OperationalError:接近"primary":语法错误

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

Mar*_*ijn 11

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

CREATE TABLE items
( id INTEGER PRIMARY KEY
, x  DOUBLE
, y  DOUBLE
);
Run Code Online (Sandbox Code Playgroud)

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

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

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


编辑:既然你说X和Y是变量,那么也可以让你把这些变量绑定到SQL语句的正确轨道上:

curs.execute("INSERT INTO items (X, Y) VALUES (:X, :Y)", {X: X, Y: Y})
Run Code Online (Sandbox Code Playgroud)

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

SQL语句中的:X:Y参数引用作为第二个参数传递给语句的字典XY成员execute.

绑定参数比将参数包含在SQL字符串本身中更安全,更快捷.