2016-09-26 2 views
0

PostgreSQL은 당신이 행을 삭제하고이 구문을 사용하여 삭제 된 행의 열 값을 반환 할 수 있습니다 방법 :삭제하고 파이썬에서 커서에서 값을 반환

DELETE FROM [table_name] RETURNING [column_names] 

내가 사용하여 파이썬에서이 구문을 사용하고 싶습니다를 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이 거짓으로 설정되어 있는지 다시 한 번 확인하는 것이 좋습니다.) 이는 변경 사항이 모두 사용자에게만 표시된다는 것을 의미합니다 (실제로는 다른 트랜잭션 설정에 따라 다름) 이러한 변경을 저지하십시오. 더 확신 할 기록하는 것이 필요하지 않은 그래서

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

, 내가 두 번째 옵션을 사용하도록 건의 할 것입니다 : fetchall이

>>> 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 
[] 

을 커밋 :

두 옵션 모두이 경우에 작동 실제로 삭제되었지만 동일한 트랜잭션 내에서 해당 ID로 작업해야하는 경우 첫 번째 옵션을 사용해야합니다.

관련 문제