6

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

然而,这不是很可怕吗?我不想这样做。我想让我的代码清晰而智能。

4

2 回答 2

8

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

CREATE TABLE sample ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
                      test REAL);
于 2013-11-01T11:46:47.287 回答
6

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

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

于 2013-11-01T11:44:44.813 回答