sqlite3.操作错误:在CREATE TABLE语句中“X”附近的语法错误
这段代码:
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" 附近:语法错误
这是怎么回事呢?我看不出我哪里出错了。顺便说一下,我放进去的值都是变量。
2 个回答
-2
import sqlite3
conn=sqlite3.connect('sqlite.db')
conn.execute('''
Creat: table student (
st_id INT AUTO INCREMENT PRIMARY KEY,
st_name VARCHAR(50),
st_class VARCHAR(10),
st_class VARCHAR(30)
)
''')
conn.close()
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。
11
你的 CREATE TABLE 语句有问题:它没有给第一个列('integer primary key')指定一个名字。SQLite 现在认为这个字段的名字是 integer,而且没有定义数据类型。你可能是想要一个 INTEGER PRIMARY KEY 字段,因为这样效率很高。要做到这一点,请遵循 CREATE TABLE 的语法,并给它一个名字:
CREATE TABLE items
( id INTEGER PRIMARY KEY
, x DOUBLE
, y DOUBLE
);
顺便说一下,我把 X 和 Y 定义为双精度浮点数(doubles),因为指定数据类型是个好习惯,而且效率也稍微高一点。当然,如果你想放文本,就把它们定义为 TEXT。如果你主要想放整数,就定义为 INTEGER。只有在你真的不知道要放什么数据时,才可以不写数据类型。
接下来,由于 INSERT 语句 只期待字段名(而不是它们的完整定义),所以 SQLite 报了一个语法错误——这也是对的。
最后,你不觉得把 'today'(一个文本值)放到一个整数列里有点傻吗?!
编辑:既然你说 X 和 Y 是变量,那我就给你指条明路,教你怎么把这些变量绑定到 SQL 语句上:
curs.execute("INSERT INTO items (X, Y) VALUES (:X, :Y)", {X: X, Y: Y})
我省略了 id
主键字段,因为如果没有这个字段,SQLite 会自动生成一个。如果你想传一个具体的值,也是可以的。但要确保这个值是整数,并且是唯一的!
SQL 语句中的 :X
和 :Y
参数指的是作为第二个参数传给 execute
语句的字典中的 X
和 Y
成员。
绑定参数 比把参数直接放到 SQL 字符串中更安全也更快。