在python的sqlite3中,我正在尝试创建一个程序,其中要写入的表中的新行将被插入,需要打印出来。但我刚刚读了documentation here应该在execute()语句中使用INSERT。问题是我正在制作的程序询问用户他/她的信息,并且将为该成员分配主键ID,因为必须显示他/她的ID号。换句话说,执行(“INSERT”)语句不能首先执行,因为ID键对于成员的赋值是错误的。
我首先想到lastrowid可以在不使用execute(“INSERT”)的情况下运行,但我注意到它总是给我值“None”。然后我在python中阅读sqlite3中的文档,用google搜索替代方案来解决这个问题。
我在谷歌的某处读过可以使用SELECT last_insert_rowid()但是可以在python中询问它的语法是否正常?我试过像这样编码
NextID = con.execute("select last_insert_rowid()")
但它只给了我一个游标对象输出“”
我一直在考虑制作另一张表,其中只有一个值。只要主表中有新的数据输入,它就会得到主表的lastrowid值。然后,它将获取的值将被插入并覆盖在另一个表中,以便每次需要在主表中输入新的数据集并且需要下一行ID时,它将只访问具有该值的表
还是有另一种更简单的方法吗?
非常感谢任何帮助深深地鞠躬
答案 0 :(得分:2)
如果您在向用户询问他/她的信息之前查询您的表,则可以猜测 下一个ID
SELECT MAX(ID) + 1 as NewID FROM DesiredTable
。
在插入新数据(包括新ID)之前,启动一个事务, 只有在插入失败时才会回滚(因为使用相同的操作,另一个进程更快)并再次询问您的用户。如果eveything正常,那就做一个提交。
答案 1 :(得分: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, ))
所以基本上,为了获得lastrowid,我最终插入了Dummy数据,然后在获得lastrowid的值后,虚拟数据将被删除。
答案 2 :(得分:0)
lastrowid 此只读属性提供最后修改的行的rowid。仅当您使用execute()方法发出INSERT语句时才设置。对于INSERT以外的操作或调用executemany()时,lastrowid设置为None。