2016-09-26 28 views
0

PostgreSQL允許你刪除行並返回使用此語法刪除行的列值:如何刪除從光標在Python返回值

DELETE FROM [table_name] RETURNING [column_names] 

我想在Python中使用此語法使用psycopg2庫。所以我寫道:

cur = con.cursor() 

cur.execute('DELETE FROM [my_table_name] RETURNING [column_name, let's say id]') 

現在我不知道後來寫什麼。它應該是:

con.commit() 

但是,這本身並不會返回遊標的任何值。或者應該是:

rows = cur.fetchall() 

,然後遍歷行列表?

但是這種方法實際上是否會刪除行?它似乎失去了提交。

或可能是我應該寫兩個,像這樣:

但我不知道這是正確的。試一試可能是一種選擇,但如果你們中有些人知道答案,那對我來說會更安全。

回答

0

您的查詢在事務內部運行(但最好仔細檢查autocommit設置爲False),這意味着您所做的所有更改僅對您可見(實際上取決於其他事務設置),直到您提交這些更改。

兩個選項在這種情況下工作:

>>> con = db() 
>>> cur = con.cursor() 
>>> cur.execute("DELETE FROM tmp_delete_test WHERE id < 3 RETURNING id;") 
>>> result = cur.fetchall() 
>>> result 
[(1,), (2,)] 
>>> con.commit() 
>>> cur.execute("DELETE FROM tmp_delete_test WHERE id < 3 RETURNING id;") 
>>> result = cur.fetchall() 
>>> result 
[] 

並提交,使用fetchall:

>>> cur.execute("DELETE FROM tmp_delete_test WHERE id < 4 RETURNING id;") 
>>> con.commit() 
>>> result = cur.fetchall() 
>>> result 
[(3,)] 

所以,我建議你使用第二個選擇,如果你不需要確保記錄實際上已被刪除,但如果您需要在同一事務中使用該ID進行操作,則需要使用第一個選項。