1212# See the License for the specific language governing permissions and
1313# limitations under the License.
1414import base64
15-
1615import re
17-
16+ import sqlalchemy
1817from alembic .ddl .base import (
1918 ColumnNullable ,
2019 ColumnType ,
2524from google .api_core .client_options import ClientOptions
2625from google .auth .credentials import AnonymousCredentials
2726from 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
3028from sqlalchemy import ForeignKeyConstraint , types , TypeDecorator , PickleType
3129from sqlalchemy .engine .base import Engine
3230from sqlalchemy .engine .default import DefaultDialect , DefaultExecutionContext
3331from sqlalchemy .event import listens_for
32+ from sqlalchemy .exc import NoSuchTableError
3433from sqlalchemy .ext .compiler import compiles
3534from sqlalchemy .pool import Pool
35+ from sqlalchemy .sql import elements
36+ from sqlalchemy .sql import expression
3637from sqlalchemy .sql .compiler import (
3738 selectable ,
3839 DDLCompiler ,
4445)
4546from sqlalchemy .sql .default_comparator import operator_lookup
4647from sqlalchemy .sql .operators import json_getitem_op
47- from sqlalchemy .sql import expression
4848
49- from google .cloud .spanner_v1 .data_types import JsonObject
5049from google .cloud import spanner_dbapi
51- from google .cloud .sqlalchemy_spanner ._opentelemetry_tracing import trace_call
5250from google .cloud .sqlalchemy_spanner import version as sqlalchemy_spanner_version
53- import sqlalchemy
51+ from google . cloud . sqlalchemy_spanner . _opentelemetry_tracing import trace_call
5452
5553USING_SQLACLCHEMY_20 = False
5654if sqlalchemy .__version__ .split ("." )[0 ] == "2" :
6361@listens_for (Pool , "reset" )
6462def reset_connection (dbapi_conn , connection_record , reset_state = None ):
6563 """An event of returning a connection back to a pool."""
64+ if hasattr (dbapi_conn , "driver_connection" ):
65+ dbapi_conn = dbapi_conn .driver_connection
6666 if hasattr (dbapi_conn , "connection" ):
6767 dbapi_conn = dbapi_conn .connection
6868 if isinstance (dbapi_conn , spanner_dbapi .Connection ):
69- if dbapi_conn .inside_transaction :
69+ # Use the new property instead of the deprecated one
70+ transaction_started = getattr (
71+ dbapi_conn ,
72+ "spanner_transaction_started" ,
73+ getattr (dbapi_conn , "inside_transaction" , False ),
74+ )
75+ if transaction_started :
7076 dbapi_conn .rollback ()
71-
7277 dbapi_conn .staleness = None
7378 dbapi_conn .read_only = False
7479
@@ -1709,7 +1714,7 @@ def set_isolation_level(self, conn_proxy, level):
17091714 conn_proxy (
17101715 Union[
17111716 sqlalchemy.pool._ConnectionFairy,
1712- spanner_dbapi.connection .Connection,
1717+ spanner_dbapi.driver_connection .Connection,
17131718 ]
17141719 ):
17151720 Database connection proxy object or the connection itself.
@@ -1718,7 +1723,7 @@ def set_isolation_level(self, conn_proxy, level):
17181723 if isinstance (conn_proxy , spanner_dbapi .Connection ):
17191724 conn = conn_proxy
17201725 else :
1721- conn = conn_proxy .connection
1726+ conn = conn_proxy .driver_connection
17221727
17231728 if level == "AUTOCOMMIT" :
17241729 conn .autocommit = True
@@ -1735,7 +1740,7 @@ def get_isolation_level(self, conn_proxy):
17351740 conn_proxy (
17361741 Union[
17371742 sqlalchemy.pool._ConnectionFairy,
1738- spanner_dbapi.connection .Connection,
1743+ spanner_dbapi.driver_connection .Connection,
17391744 ]
17401745 ):
17411746 Database connection proxy object or the connection itself.
@@ -1746,7 +1751,7 @@ def get_isolation_level(self, conn_proxy):
17461751 if isinstance (conn_proxy , spanner_dbapi .Connection ):
17471752 conn = conn_proxy
17481753 else :
1749- conn = conn_proxy .connection
1754+ conn = conn_proxy .driver_connection
17501755
17511756 if conn .autocommit :
17521757 return "AUTOCOMMIT"
0 commit comments