2011-03-01 31 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,我最終得到的值之後插入僞數據,則的拉斯特羅伊德,虛擬數據將被刪除。

相關問題