2016-12-28 133 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