我使用SQLite3创建了一个数据库。 我的python版本是2.7.5。
在创建数据库之前,我只是创建了示例数据库,并测试它是否运行良好。
并且失败了id
即使我没有增加
将其声明为serial
类型。
我创建了简单的数据库:
import sqlite3
con = sqlite3.connect('sample.db')
cur = con.cursor()
cur.execute("""CREATE TABLE sample(id serial,test real)""")
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(3,))
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(6,))
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(8,))
con.commit()
然后我获取了所有数据:
data = cur.execute("""SELECT * from sample""")
t = data.fetchall()
In [33]: t
Out[33]: [(None, 3.0), (None, 6.0), (None, 8.0)]
我预料到这一点:Out[33]: [(1, 3.0), (2, 6.0), (3, 8.0)]
但是,如您所见,所有id
元素都是None
我该如何解决这个问题? 我知道只需增加一个变量并插入它即可。 像这样:
id += 1
cur.execute("""CREATE TABLE sample(id serial,test real)""")
id += 1
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(3,))
id += 1
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(6,))
然而,这不是很糟糕吗?我不想这样做。 我想让我的代码清晰明了。
答案 0 :(得分:6)
SQLite中没有serial
数据类型。创建表的正确方法是在SQLite中使用AUTOINCREMENT:
CREATE TABLE sample ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
test REAL);
答案 1 :(得分:4)
您需要将列标记为INTEGER PRIMARY KEY
或INTEGER PRIMARY KEY AUTOINCREMENT
才能获得自动增量行为。
这两种类型之间的区别是微妙的;后一种形式永远不会重复使用ID。请参阅ROWID and the INTEGER PRIMARY KEY文档。