lastrowid在Python 3中的SQLite3中返回



我遇到了一些麻烦,试图解决我使用python从sqlite3中检索最后一个插入ID时遇到的问题。这是我的代码的示例:

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'的价值时,我都会获得'none'的返回值。

任何帮助将不胜感激,谢谢。

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

最新更新