在Python SQLite中,不使用execute的lastrowid()替代方案或语法?

2 投票
3 回答
4832 浏览
提问于 2025-04-16 12:42

在Python的sqlite3中,我正在尝试制作一个程序,想要在表格中插入新行时,能够打印出这个新行的内容。但是我刚刚看到文档说,插入数据时应该使用execute()语句中的INSERT。问题是,我的程序需要用户输入他们的信息,而主键ID会被分配给会员,因为这个ID号必须显示出来。换句话说,execute("INSERT")语句不能先执行,因为这样分配给会员的ID会出错。

我最开始以为可以在不使用execute("INSERT")的情况下运行lastrowid,但我发现它总是返回“None”。然后我查阅了Python的sqlite3文档,并在网上搜索解决这个问题的其他方法。

我在网上看到可以使用SELECT last_insert_rowid(),但我想问一下在Python中它的语法是什么?我试着这样写代码:

NextID = con.execute("select last_insert_rowid()")

但是它只给了我一个游标对象的输出“”

我还在考虑是否可以再创建一个表格,里面只存一个值。每当主表中有新数据输入时,它就会获取主表的lastrowid值。这个值会被插入并覆盖在另一个表中,这样每次需要在主表中输入新数据并获取下一个行ID时,就可以直接访问那个只有一个值的表。

或者有没有其他更简单的方法可以做到这一点呢?

非常感谢任何帮助深深鞠躬

3 个回答

0

lastrowid

这个只读属性可以告诉你最后修改的那一行的ID。它只有在你使用execute()方法执行了INSERT语句时才会被设置。如果你进行的操作不是INSERT,或者你调用了executemany(),那么lastrowid的值就会是None,也就是没有值。

来源:https://docs.python.org/2/library/sqlite3.html

0

感谢大家提供的答案和建议,不过我最后做了这样的处理:

#only to get the value of NextID to display
TempNick = "ThisIsADummyNickToBeDeleted"        
cur.execute("insert into Members (Nick) values (?)", (TempNick, ))
NextID = cur.lastrowid 
cur.execute("delete from Members where ID = ?",  (NextID, ))

简单来说,为了获取最后一行的ID,我插入了一条虚拟数据,然后在获取到最后一行的ID后,就把这条虚拟数据删除了。

2

你可以在询问用户信息之前,先通过查询你的表来猜测下一个ID,方法是使用 SELECT MAX(ID) + 1 as NewID FROM DesiredTable

在插入新数据(包括新的ID)之前,先启动一个事务,只有在插入失败(因为其他进程更快地进行了相同的操作)时才回滚,并再次询问用户。如果一切正常,就提交这个事务。

撰写回答