12
12
# See the License for the specific language governing permissions and
13
13
# limitations under the License.
14
14
import base64
15
-
16
15
import re
17
-
16
+ import sqlalchemy
18
17
from alembic .ddl .base import (
19
18
ColumnNullable ,
20
19
ColumnType ,
25
24
from google .api_core .client_options import ClientOptions
26
25
from google .auth .credentials import AnonymousCredentials
27
26
from google .cloud .spanner_v1 import Client , TransactionOptions
28
- from sqlalchemy .exc import NoSuchTableError
29
- from sqlalchemy .sql import elements
27
+ from google .cloud .spanner_v1 .data_types import JsonObject
30
28
from sqlalchemy import ForeignKeyConstraint , types , TypeDecorator , PickleType
31
29
from sqlalchemy .engine .base import Engine
32
30
from sqlalchemy .engine .default import DefaultDialect , DefaultExecutionContext
33
31
from sqlalchemy .event import listens_for
32
+ from sqlalchemy .exc import NoSuchTableError
34
33
from sqlalchemy .ext .compiler import compiles
35
34
from sqlalchemy .pool import Pool
35
+ from sqlalchemy .sql import elements
36
+ from sqlalchemy .sql import expression
36
37
from sqlalchemy .sql .compiler import (
37
38
selectable ,
38
39
DDLCompiler ,
44
45
)
45
46
from sqlalchemy .sql .default_comparator import operator_lookup
46
47
from sqlalchemy .sql .operators import json_getitem_op
47
- from sqlalchemy .sql import expression
48
48
49
- from google .cloud .spanner_v1 .data_types import JsonObject
50
49
from google .cloud import spanner_dbapi
51
- from google .cloud .sqlalchemy_spanner ._opentelemetry_tracing import trace_call
52
50
from google .cloud .sqlalchemy_spanner import version as sqlalchemy_spanner_version
53
- import sqlalchemy
51
+ from google . cloud . sqlalchemy_spanner . _opentelemetry_tracing import trace_call
54
52
55
53
USING_SQLACLCHEMY_20 = False
56
54
if sqlalchemy .__version__ .split ("." )[0 ] == "2" :
63
61
@listens_for (Pool , "reset" )
64
62
def reset_connection (dbapi_conn , connection_record , reset_state = None ):
65
63
"""An event of returning a connection back to a pool."""
64
+ if hasattr (dbapi_conn , "driver_connection" ):
65
+ dbapi_conn = dbapi_conn .driver_connection
66
66
if hasattr (dbapi_conn , "connection" ):
67
67
dbapi_conn = dbapi_conn .connection
68
68
if isinstance (dbapi_conn , spanner_dbapi .Connection ):
69
- if dbapi_conn .inside_transaction :
69
+ transaction_started = getattr (
70
+ dbapi_conn ,
71
+ "spanner_transaction_started" ,
72
+ getattr (dbapi_conn , "inside_transaction" , False ),
73
+ )
74
+ if transaction_started :
70
75
dbapi_conn .rollback ()
71
-
72
76
dbapi_conn .staleness = None
73
77
dbapi_conn .read_only = False
74
78
@@ -1709,7 +1713,7 @@ def set_isolation_level(self, conn_proxy, level):
1709
1713
conn_proxy (
1710
1714
Union[
1711
1715
sqlalchemy.pool._ConnectionFairy,
1712
- spanner_dbapi.connection .Connection,
1716
+ spanner_dbapi.driver_connection .Connection,
1713
1717
]
1714
1718
):
1715
1719
Database connection proxy object or the connection itself.
@@ -1718,7 +1722,7 @@ def set_isolation_level(self, conn_proxy, level):
1718
1722
if isinstance (conn_proxy , spanner_dbapi .Connection ):
1719
1723
conn = conn_proxy
1720
1724
else :
1721
- conn = conn_proxy .connection
1725
+ conn = conn_proxy .driver_connection
1722
1726
1723
1727
if level == "AUTOCOMMIT" :
1724
1728
conn .autocommit = True
@@ -1735,7 +1739,7 @@ def get_isolation_level(self, conn_proxy):
1735
1739
conn_proxy (
1736
1740
Union[
1737
1741
sqlalchemy.pool._ConnectionFairy,
1738
- spanner_dbapi.connection .Connection,
1742
+ spanner_dbapi.driver_connection .Connection,
1739
1743
]
1740
1744
):
1741
1745
Database connection proxy object or the connection itself.
@@ -1746,7 +1750,7 @@ def get_isolation_level(self, conn_proxy):
1746
1750
if isinstance (conn_proxy , spanner_dbapi .Connection ):
1747
1751
conn = conn_proxy
1748
1752
else :
1749
- conn = conn_proxy .connection
1753
+ conn = conn_proxy .driver_connection
1750
1754
1751
1755
if conn .autocommit :
1752
1756
return "AUTOCOMMIT"
0 commit comments