Knowledge Map

SQLAlchemy session transaction delete 문제 본문

PYTHON

SQLAlchemy session transaction delete 문제

2018.04.12 13:17

python3.6 에서 pymysql + sqlalchemy를 사용하게 되었을 때 생기는 문제이다.


다른 것들은 테스트해보지 않았는데, session객체에 delete()를 2개 이상 등록한 다음에 session.commit()을 하게 되면 delete()한 순서대로 동작하지 않고 임의의 순서로 동작하는 것 같다.


a 테이블이 b 테이블의 primary key를 참조키로 들고 있다. 따라서 b 테이블의 데이터를 지울려면 먼저 그것을 참조하고 있는 a 테이블의 값을 지워야 한다.


session.delete(a);

session.delete(b);

session.commit();


하지만 그러면 아래와 같은 메세지가 나온다.


sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1451, 'Cannot delete or update a parent row: a foreign key constraint fails ....


즉 b를 먼저 삭제하려 했기 때문에 나타나는 메세지인데, 위의 순서상 a 부터 먼저 지워져야 한다. 하지만 그렇게 동작하지 않는다. 간혹 지워지는 경우가 있는데, 이것은 a가 먼저 삭제 되었기 때문이다.


재미있는 점은 python2에서는 잘 동작한다는 것이다. python3로 옮기고 나서 처음 맞이하는(?) 에러이다. 

따라서 이럴떄는 조금 그렇지만 그냥 session.commit()을 더 넣어준다.;



session.delete(a);

session.commit();

session.delete(b);

session.commit();


이러면 잘 동작한다.

0 Comments