2011-03-01 63 views
2

在python中的sqlite3中,我试图创建一个程序,其中要写入的表中的新行将插入下一个,需要打印出来。但我只是读了documentation here,在execute()语句中应该使用INSERT。问题在于我要提供的程序要求用户输入他/她的信息,并且必须为成员分配主密钥ID,因为他/她的ID号码必须显示。换句话说,不应该首先执行execute(“INSERT”)语句,因为ID键在分配成员时会出错。lastrowid()替代或语法没有使用在sqlite python中执行?

我首先想到lastrowid可以在不使用execute(“INSERT”)的情况下运行,但我注意到它总是给我值“None”。然后我阅读python中的sqlite3中的文档,并使用Google搜索替代方法来解决此问题。

我已经通过谷歌阅读的地方,可以使用SELECT last_insert_rowid(),但它会是没问题,它是什么语法在Python?我已经试过编码像这样

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

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

我也一直在思考只是让另一个表,其中总会有只有一个值。当主表中有新的数据输入时,它将获得主表lastrowid的值。它的值将被插入并覆盖到另一个表中,这样每当需要在主表中输入一组新数据并且需要下一个行ID时,它将只访问具有该值的表。

或者是否有这样做的替代和更简单的方法?

任何帮助是非常赞赏鞠躬深深

+0

插入部分记录,标记为未启用,现在您可以显示数据。用完整的数据更新它,并在有其他信息时将其标记为启用。 – btilly 2011-03-01 01:41:03

+0

@btilly - 请问如何将其标记为“未启用”,是否可以?所以你说的是,当完整的数据将被添加,它首先删除第一个数据?我很抱歉,我不确定我是否理解^^ ;; – hyoumoku 2011-03-01 09:12:55

+0

我的意思是说,你在所有查询中都会有一个字段放在过滤器上,表示“忽略这个”。这从忽略状态开始,然后在完成时翻转它。如果更改其他查询太难了,可以总是有两个表。你首先插入一个主键ID。然后你将完成的数据复制到另一个,它不会尝试创建任何主键ID。这是浪费,但可能更容易实施。 – btilly 2011-03-01 16:16:28

回答

2

你可以猜测下一个ID,如果你会询问用户为他/她的信息与 SELECT MAX(ID) + 1 as NewID FROM DesiredTable前查询您的表

在插入新数据(包括新ID)之前,启动一个事务, 仅当插入失败时(因为另一个进程在同一操作中速度更快)才会回滚并再次询问用户。如果eveything没问题,只需要提交。

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,我最终得到的值之后插入伪数据,则的拉斯特罗伊德,虚拟数据将被删除。

相关问题