2013-11-01 50 views
5

我正在使用SQLite3創建數據庫。 和我的python版本是2.7.5。SQLite3串行類型未增加

在創建數據庫之前,我只是簡單地創建了示例數據庫並測試它是否會正常工作。 並且它失敗了,即使我 聲明它爲serial類型,id也不會增加。

我創建簡單的數據庫:

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

你從哪裏得到「串行」類型*? SQLite中沒有這樣的關鍵字。 –

+0

真的嗎?我在互聯網上也發現了它! 嗯,那麼有什麼替代品可以做到我想要的嗎? – SamuraiT

回答

6

SQLite中沒有serial數據類型。創建表的正確方法是在SQLite中使用AUTOINCREMENT

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

非常感謝您的幫助! 但是NOT NULL是做什麼的? 我可以忽略它嗎?或者會發生錯誤? – SamuraiT

+0

NOT NULL只是表示該字段是必需的。而且,是的,你可以省略它。 –

+0

好吧,所以我明白'NOT NULL'是可選的。 – SamuraiT

4

您需要將列標記爲INTEGER PRIMARY KEYINTEGER PRIMARY KEY AUTOINCREMENT才能獲得自動增量行爲。

這兩種類型之間的區別是微妙的;後一種形式將永遠不會重用ID。請參閱ROWID and the INTEGER PRIMARY KEY文檔。

+0

恩,現在我明白你的意思了!謝謝! – SamuraiT

+0

很高興能有幫助!對不起,您只能標記*一個*答案,而不是兩個。 :-) –

+0

起初,我無法很好地理解你的回答,但在亞歷山大·朱可夫先生的回答之後,我試着去做他告訴我的事情。然後最終,我明白你的意思了。所以我將他的答案標記爲正弦,這是我理解的第一個答案。 – SamuraiT

相關問題