查询返回值时出现Sqlite OperationalError

jgovgodb  于 2023-01-02  发布在  SQLite
关注(0)|答案(2)|浏览(134)

是否可以在查询返回值之后立即在数据库上执行提交(如果该值未被获取)?查询中的 returning 语句是否锁定游标并在未获取值时阻止提交?

示例/如何重现

给定下表products,构建如下:

create table products (id INTEGER, name TEXT, price INTEGER, PRIMARY KEY (id));

可以执行以下用于插入元素的查询,而不会出现任何错误:

conn = sqlite3.connect('test.db')
cursor = conn.cursor()
query1 = 'insert into products (id, name, price) values (?,?,?)'
cursor.execute(query1, (1, 'apple', 100))
conn.commit()

不过,当使用返回元素ID的查询(例如

query2 = 'insert into products (id, name, price) values (?,?,?) returning id'
cursor.execute(query2, (2, 'cherry', 250))
conn.commit()

将引发以下错误

OperationalError: cannot commit transaction - SQL statements in progress
yyyllmsg

yyyllmsg1#

使用lastrowid:

query2 = 'insert into products (id, name, price) values (?,?,?)'
cursor.execute(query2, (2, 'cherry', 250))

print(cursor.lastrowid)
trnvg8h3

trnvg8h32#

我知道这件事已经有一段时间了,但以防万一它能帮助到别人。
为了让你的代码能够使用 returning 子句,你需要在提交之前先获取结果:

query2 = 'insert into products (id, name, price) values (?,?,?) returning id'
id = cursor.execute(query2, (2, 'cherry', 250)).fetchone()  # <--- here

print(id)
conn.commit()

相关问题