@@ -20,24 +20,31 @@ def __init__(self, url, **engine_kwargs):
20
20
dialect = self ._session .get_bind ().dialect
21
21
self ._is_postgres = dialect .name in {"postgres" , "postgresql" }
22
22
self ._sanitize_statement = statement_factory (dialect )
23
- self ._autocommit = False
23
+ self ._outside_transaction = True
24
24
25
25
def execute (self , sql , * args , ** kwargs ):
26
26
"""Execute a SQL statement."""
27
27
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
33
40
34
- result = self ._execute (statement )
41
+ if statement .is_transaction_start ():
42
+ self ._outside_transaction = False
35
43
36
- if self ._autocommit :
37
- self ._session .execute ("COMMIT" )
44
+ _logger .debug (termcolor .colored (str (statement ), "green" ))
38
45
39
46
if statement .is_transaction_end ():
40
- self ._autocommit = True
47
+ self ._outside_transaction = True
41
48
42
49
if statement .is_select ():
43
50
ret = fetch_select_result (result )
@@ -48,28 +55,11 @@ def execute(self, sql, *args, **kwargs):
48
55
else :
49
56
ret = True
50
57
51
- if self ._autocommit :
58
+ if self ._outside_transaction :
52
59
self ._session .remove ()
53
60
54
61
return ret
55
62
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
-
73
63
def _last_row_id_or_none (self , result ):
74
64
if self ._is_postgres :
75
65
return self ._get_last_val ()
0 commit comments