2017-04-13 93 views
1

我已經查看了與此類似的其他問題,但有些模糊與答案的解釋很少。 我所擁有的是一個包含n個列的6個表的sql數據庫。我想用python列表中的數據更新,而不是插入其中一個表中的列。這是一個名爲gbufids的列表,由整數組成,但每個條目不包含在元組中,即[0,1,2,3]不包含[(1,),(2,),(3,)]。 我想更改的表名稱爲Versions,該列稱爲ObjectID。我嘗試了不同的方式,但是沒有人以這種方式完成工作。我使用了以下內容,我相信應該在更新表(版本)中的列(ObjectID)之前將列表中的每個項目轉換爲元組:cur.executemany('UPDATE Versions set ObjectID =?',((val, )for gbufids中的val))使用Python,sqlite3和列表更新SQL數據庫中的列

接下來是提交和關閉。我讀過,如果我使用UPDATE,我需要一個WHERE子句,但是我對行有點困惑。對我來說,一行是連續的所有單元格,但這可能不是這個意思。如果任何人都可以提供一個答案是具體到我的數據庫,表和列,但應理解

+0

SQL表是無序的。應該如何識別這些行? –

+0

那麼,如上所述,我有一個命名錶中的命名列,我想從命名列中的第一個單元格填充到給定列表中每個條目的命名列中的最後一個單元格。你能告訴我如何用原始文章中給出的信息來實現嗎?如果你覺得我遺漏了一些東西,那可能是因爲我不確定這件事,並且可能會做一些幫助或解釋。謝謝 – EMJAY

+0

顯示一些示例數據。哪個列表條目進入哪個表格行? –

回答

0

UPDATE聲明沒有WHERE條款將導致所有行的表與每個值來更新您傳遞到executemany,這意味着最終所有行都會填入您傳遞的最後一個值。爲了將每個值與特定行進行匹配,您需要一些方法來在數據庫的每次運行中告訴數據庫要替換的行。如果您確定更新值列表的長度等於表中的行數,並且列表的順序與使用簡單的SELECT * FROM table獲得的行的順序相同,則最簡單的辦法是讓在表的rowid是清單:

rowids = [row[0] for row in cur.execute('SELECT rowid FROM Versions')] 

然後你就可以配對rowidsgbufids並傳遞到您的executemany

cur.executemany('UPDATE Versions SET ObjectID=? WHERE rowid=?', zip(gbufids, rowids)) 
+0

非常感謝,我有我的代碼版本,做我需要的。我無法將其作爲新問題或評論發佈。我想分享我的內容,以便其他人可以使用它。 – EMJAY

+0

@EMJAY發佈自己的問題答案沒有任何問題。只要將它發佈爲像您一樣的答案,如果這是其他人的問題。 – glibdud

+0

我試過了,但我想我可能在回答時遇到阻塞,因爲之前我在第一次在這裏時添加的答案。他們困擾着我。顯然,雖然我可以編輯以前的答案,因此係統會將其識別爲有效。一旦我做完了,我會更新這個答案。 – EMJAY