SQLAlchemy에서는 Transaction을 사용하여 with 구문이 정상 실행시에 commit되고 구문내에서 예외 발생시에 rollback 되도록 할 수 있다.
Commit As You Go
SQLAlchemy 2.0 이상부터 제공되는 기능. 공식문서에 아래와 같이 안내되어 있다.
1.4 버전에서 테스트 해보니, commit()실행과 상관없이 각 실행이 autocommit되며 connection에서 commit()을 지원하지 않는다.
New in version 2.0: “commit as you go” style is a new feature of SQLAlchemy 2.0. It is also available in SQLAlchemy 1.4’s “transitional” mode when using a “future” style engine.
from sqlalchemy import create_engine
from sqlalchemy import text
engine = create_engine("{db_url}")
with engine.connect() as connection:
connection.execute(text("INSERT into test (id) values (1)"))
connection.execute(text("INSERT into test (id) values (2)"))
# commit을 명시적으로 실행 해주어야 함
connection.commit()
Begin Once
sqlalchemy==1.4.x
from sqlalchemy import create_engine
engine = create_engine("{db_url}")
with engine.connect() as connection:
with connection.begin():
connection.execute("INSERT into test (id) values (1)")
connection.execute("INSERT into test (id) values (2)")
sqlalchemy==2.0.x
from sqlalchemy import create_engine
from sqlalchemy import text
engine = create_engine("{db_url}")
with engine.connect() as connection:
with connection.begin():
connection.execute(text("INSERT into test (id) values (1)"))
connection.execute(text("INSERT into test (id) values (2)"))
Connect and Begin Once from the Engine
sqlalchemy==1.4.x
from sqlalchemy import create_engine
engine = create_engine("{db_url}")
with warehouse_engine.begin() as connection:
connection.execute("INSERT into test (id) values (1)")
connection.execute("INSERT into test (id) values (2)")
sqlalchemy==2.0.x
from sqlalchemy import create_engine
from sqlalchemy import text
engine = create_engine("{db_url}")
with warehouse_engine.begin() as connection:
connection.execute(text("INSERT into test (id) values (1)"))
connection.execute(text("INSERT into test (id) values (2)"))
with문 대신 try/except 문 사용
sqlalchemy==1.4.x
from sqlalchemy import create_engine
engine = create_engine("{db_url}")
connection = warehouse_engine.connect()
trans = connection.begin()
try:
connection.execute("INSERT into test (id) values (1)")
connection.execute("INSERT into test (id) values (2)")
trans.commit()
except:
trans.rollback()
print("rollback")
raise
finally:
connection.close()
sqlalchemy==2.0.x
from sqlalchemy import create_engine
from sqlalchemy import text
engine = create_engine("{db_url}")
connection = warehouse_engine.connect()
trans = connection.begin()
try:
connection.execute(text("INSERT into test (id) values (1)"))
connection.execute(text("INSERT into test (id) values (2)"))
trans.commit()
except:
trans.rollback()
print("rollback")
raise
finally:
connection.close()
'Database > SQL' 카테고리의 다른 글
PostgreSQL, MariaDB/MySQL 테이블 별 용량 확인 하기 (0) | 2023.12.17 |
---|---|
Recursive Query(재귀 쿼리) 알아보기 (0) | 2023.07.16 |
데이터베이스에서의 Transaction (트랜잭션) (0) | 2023.04.23 |
Window Function (윈도우 함수) 사용하기 (0) | 2023.04.09 |