在Python SQLite中,不使用execute的lastrowid()替代方案或语法?
在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 个回答
lastrowid
这个只读属性可以告诉你最后修改的那一行的ID。它只有在你使用execute()方法执行了INSERT语句时才会被设置。如果你进行的操作不是INSERT,或者你调用了executemany(),那么lastrowid的值就会是None,也就是没有值。
感谢大家提供的答案和建议,不过我最后做了这样的处理:
#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后,就把这条虚拟数据删除了。
你可以在询问用户信息之前,先通过查询你的表来猜测下一个ID,方法是使用
SELECT MAX(ID) + 1 as NewID FROM DesiredTable
。
在插入新数据(包括新的ID)之前,先启动一个事务,只有在插入失败(因为其他进程更快地进行了相同的操作)时才回滚,并再次询问用户。如果一切正常,就提交这个事务。