sqlite3.操作错误:在CREATE TABLE语句中“X”附近的语法错误

6 投票
2 回答
37328 浏览
提问于 2025-04-16 13:03

这段代码:

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 语句的字典中的 XY 成员。

绑定参数 比把参数直接放到 SQL 字符串中更安全也更快

撰写回答