此代码:
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。
答案 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}的字典的X
和Y
成员声明。
绑定参数为both safer and faster,而不是将参数包含在SQL字符串本身中。