2013-07-20 3 views
6

저는 PyMysql을 사용해 왔지만 지금까지 (선택/삽입) 모든 작업을 했었지만 업데이트하려고하면 아무런 오류도없고 아무 것도하지 않습니다. PyMysql 업데이트 쿼리

import pymysql 
connection = pymysql.connect(...) 
cursor = connection.cursor() 
cursor.execute("UPDATE Users SET IsConnected='1' WHERE Username='test'") 
cursor.close() 
connection.close() 

와 그래 난 두 번 사용자,는, isConnected과 사용자 이름이 모두 정확하고 테스트가 존재하는 것을 확인했습니다

내 문제가 여기에 무엇을 (거기에 작품을 선택)?

+1

pymysql이 명시 적으로 커밋하지 않은 트랜잭션을 자동으로 시작하고 있으므로 연결을 닫으면 트랜잭션이 롤백되는 것으로 생각됩니다. –

+0

그래서 문제를 해결하려면 어떻게해야합니까? cursor.close()를 제거하십시오. connection.close()? – Shay

+3

'cursor.execute() '호출 후'connection.commit()'에 대한 호출을 시도하십시오. –

답변

12

업데이트를 실행하면 MySQL이 암시 적으로 트랜잭션을 시작합니다. 연결을 끊을 때 트랜잭션이 자동으로 롤백되지 않도록 업데이트를 실행 한 후 connection.commit()을 호출하여이 트랜잭션을 커밋해야합니다.

MySQL (적어도 테이블 용 InnoDB 엔진을 사용하는 경우) 일련의 업데이트/삽입 문을 실행하여 단일 작업으로 효과적으로 커밋하거나 롤백 할 수 있도록 transactions을 지원합니다 적용됩니다. 명시 적으로 트랜잭션을 커밋하지 않으면 데이터베이스 연결을 닫을 때 자동으로 롤백됩니다.

10

실제로 @JoeDay가 위에서 설명한 내용은 기본 MySQL 트랜잭션 동작과 관련이 거의 없습니다. MySQL은 기본적으로 auto-commit mode에서 작동하며 변경 사항을 지속하기 위해 일반적으로 추가 트위스트가 필요하지 않습니다.

기본적으로 MySQL은 자동 커밋 모드를 사용하여 실행됩니다. 즉, 테이블을 업데이트 (수정)하는 문장을 실행하자마자 MySQL은 디스크에 업데이트를 저장하여 영구적으로 유지합니다. 변경 사항은 롤백 할 수 없습니다.

PEP-249 (DB API) 작성자는 자동 커밋을 기본적으로 사용하지 않도록 제안하여 트랜잭션 시작을 암시 적으로 만들어 Zen of Python을 중단하기로 결정했습니다.

내가 제안하는 것은 MySQL의 기본 동작을 복원하는 것입니다. 그리고 필요할 때만 명시 적으로 트랜잭션을 사용하십시오.

import pymysql 

connection = pymysql.connect(autocommit=True) 

나는 또한 그것에 대해 약간의 참고 문헌이있는 here에 대해 작성했습니다.

+0

이것은 가장 좋은 답변입니다! – radtek