@@ -20,24 +20,31 @@ def __init__(self, url, **engine_kwargs):
2020 dialect = self ._session .get_bind ().dialect
2121 self ._is_postgres = dialect .name in {"postgres" , "postgresql" }
2222 self ._sanitize_statement = statement_factory (dialect )
23- self ._autocommit = False
23+ self ._outside_transaction = True
2424
2525 def execute (self , sql , * args , ** kwargs ):
2626 """Execute a SQL statement."""
2727 statement = self ._sanitize_statement (sql , * args , ** kwargs )
28- if statement .is_transaction_start ():
29- self ._autocommit = False
30-
31- if self ._autocommit :
32- self ._session .execute ("BEGIN" )
28+ try :
29+ with raise_errors_for_warnings ():
30+ result = self ._session .execute (statement )
31+ except sqlalchemy .exc .IntegrityError as exc :
32+ _logger .debug (termcolor .colored (str (statement ), "yellow" ))
33+ if self ._outside_transaction :
34+ self ._session .remove ()
35+ raise ValueError (exc .orig ) from None
36+ except (sqlalchemy .exc .OperationalError , sqlalchemy .exc .ProgrammingError ) as exc :
37+ self ._session .remove ()
38+ _logger .debug (termcolor .colored (statement , "red" ))
39+ raise RuntimeError (exc .orig ) from None
3340
34- result = self ._execute (statement )
41+ if statement .is_transaction_start ():
42+ self ._outside_transaction = False
3543
36- if self ._autocommit :
37- self ._session .execute ("COMMIT" )
44+ _logger .debug (termcolor .colored (str (statement ), "green" ))
3845
3946 if statement .is_transaction_end ():
40- self ._autocommit = True
47+ self ._outside_transaction = True
4148
4249 if statement .is_select ():
4350 ret = fetch_select_result (result )
@@ -48,28 +55,11 @@ def execute(self, sql, *args, **kwargs):
4855 else :
4956 ret = True
5057
51- if self ._autocommit :
58+ if self ._outside_transaction :
5259 self ._session .remove ()
5360
5461 return ret
5562
56- def _execute (self , statement ):
57- with raise_errors_for_warnings ():
58- try :
59- result = self ._session .execute (statement )
60- except sqlalchemy .exc .IntegrityError as exc :
61- _logger .debug (termcolor .colored (str (statement ), "yellow" ))
62- if self ._autocommit :
63- self ._session .remove ()
64- raise ValueError (exc .orig ) from None
65- except (sqlalchemy .exc .OperationalError , sqlalchemy .exc .ProgrammingError ) as exc :
66- self ._session .remove ()
67- _logger .debug (termcolor .colored (statement , "red" ))
68- raise RuntimeError (exc .orig ) from None
69-
70- _logger .debug (termcolor .colored (str (statement ), "green" ))
71- return result
72-
7363 def _last_row_id_or_none (self , result ):
7464 if self ._is_postgres :
7565 return self ._get_last_val ()
0 commit comments