2017-09-08 101 views
0

所以我有一個函數,它創建一個新的對象實例來表示一個帳戶,並使用SQLite3將該帳戶添加到數據庫中的帳戶表。數據庫表有3列,其中之一是主鍵accountID列,由SQL自動設置。我的對象實例需要知道此accountID,以便將來可以在數據庫中找到它自己,但我不確定如何執行此操作。我的代碼:在Python SQLite3中添加新記錄時記錄主鍵?

def createAccount(self, name, balance): 
    #ensure account name has been entered 
    if name == "": 
     messagebox.showwarning(title = "Error", message = "You did not enter an account name.") 
     return 

    #Insert new record into accounts table (primary key set automatically) 
    self.cursor.execute("""INSERT INTO accounts(name, balance) VALUES(?,?)""", (name, balance)) 

    #Create a new Account object instance and add to accounts dictionary 
    self.accounts[name] = Account(self, self.accountContainer, accountID, name, balance) 

問題是將accountID傳遞到帳戶初始化程序;我不知道如何在沒有查詢數據庫的情況下獲得這個記錄,我只是使用名稱和餘額創建的記錄,這聽起來像是一個相當混亂的解決方案。任何想法的工作?

+0

如果ID是由DBMS然後查詢表選擇可能是唯一的解決辦法(希望你沒有重複...)。國際海事組織你最好自己設置ID – GPhilo

+1

可能重複[Sqlite。如何獲取插入後自動遞增主鍵的值,而不是最後\ _insert \ _rowid()?](https://stackoverflow.com/questions/3442033/sqlite-how-to-get-value-of-auto-增量主鍵後插入其他) –

回答

1

的sqlite3的Cursor對象具有屬性lastrowid

該只讀屬性提供的最後修改的行的ROWID。只有在您使用​​方法發佈INSERTREPLACE陳述 時纔會設置。對於INSERTREPLACE或調用executemany()以外的操作,lastrowid設置爲None

如果INSERTREPLACE語句未能插入,則返回以前成功的rowid。

版本3.6更改:增加了對REPLACE語句的支持。

所以經過您的​​:

accountID = self.cursor.lastrowid 
+0

這是完美的!謝謝 :) –