2016-12-28 136 views
0

我有一些麻煩,試圖解決我在使用Python在SQLite3的查詢中檢索最後一個插入ID時遇到的問題。 這裏是我的代碼示例:lastrowid返回None在python 3 sqlite3中

import sqlite3 

# Setup our SQLite Database 
conn = sqlite3.connect('value_serve.db') 
conn.execute("PRAGMA foreign_keys = 1") # Enable Foreign Keys 
cursor = conn.cursor() 

# Create table for Categories 
conn.executescript('DROP TABLE IF EXISTS Category;') 
conn.execute('''CREATE TABLE Category (
       id    INTEGER PRIMARY KEY AUTOINCREMENT, 
       category  CHAR(132), 
       description  TEXT, 
       parent_id  INT, 
       FOREIGN KEY  (parent_id) REFERENCES Category (id) 
       );''') 

conn.execute("INSERT INTO Category (category, parent_id) VALUES ('Food', NULL)") 
food_category = cursor.lastrowid 
conn.execute("INSERT INTO Category (category, parent_id) VALUES ('Beverage', NULL)") 
beverage_category = cursor.lastrowid 
... 
conn.commit() # Commit to Database 

不管我做什麼,當我試圖讓「food_category」的值,我得到「沒有」的返回值。

任何幫助將不勝感激,在此先感謝。

回答

1

lastrowid值設置爲每個光標,並且只對該光標可見。

您需要對執行查詢的遊標執行查詢以獲取最後一行ID。你正在詢問一個任意的遊標,一個從來沒有被用來執行最後一行id查詢的遊標,但是那個遊標不能知道這個值。

如果你確實在cursor對象上執行查詢,它的工作原理:

cursor.execute("INSERT INTO Category (category, parent_id) VALUES ('Food', NULL)") 
food_category = cursor.lastrowid 

connection.execute()函數創建一個新的(本地)光標爲查詢和最後一行ID只對本地光標可見。這光標是當您使用connection.execute()返回,這樣你就可以得到從返回相同的數值:

cursor_used = conn.execute("INSERT INTO Category (category, parent_id) VALUES ('Food', NULL)") 
food_category = cursor_used.lastrowid