Knowledge Map
SQLAlchemy session transaction delete 문제 본문
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();
이러면 잘 동작한다.
'PYTHON' 카테고리의 다른 글
import _macosx 에서의 runtimeError (0) | 2018.06.01 |
---|---|
create_db using sqlalchemy (0) | 2018.05.09 |
RuntimeWarning tensolrflow does not match runtime version 3.6 (0) | 2018.01.19 |
python3 bytes class => json (0) | 2018.01.16 |
파이썬 에러 처리 (0) | 2018.01.12 |