SQLite3串行类型没有增加

时间:2013-11-01 11:39:16

标签: python sqlite

我使用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,))

然而,这不是很糟糕吗?我不想这样做。 我想让我的代码清晰明了。

2 个答案:

答案 0 :(得分:6)

SQLite中没有serial数据类型。创建表的正确方法是在SQLite中使用AUTOINCREMENT

CREATE TABLE sample ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
                      test REAL);

答案 1 :(得分:4)

您需要将列标记为INTEGER PRIMARY KEYINTEGER PRIMARY KEY AUTOINCREMENT才能获得自动增量行为。

这两种类型之间的区别是微妙的;后一种形式永远不会重复使用ID。请参阅ROWID and the INTEGER PRIMARY KEY文档。