Skip to content
This repository was archived by the owner on Mar 13, 2026. It is now read-only.

Commit e60cc57

Browse files
committed
chore: update tests for mux session usage
1 parent 6b78e35 commit e60cc57

19 files changed

+120
-107
lines changed

.github/workflows/test_suite.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ jobs:
7474

7575
services:
7676
emulator-0:
77-
image: gcr.io/cloud-spanner-emulator/emulator:latest
77+
image: gcr.io/cloud-spanner-emulator/emulator
7878
ports:
7979
- 9010:9010
8080

@@ -98,7 +98,7 @@ jobs:
9898

9999
services:
100100
emulator-0:
101-
image: gcr.io/cloud-spanner-emulator/emulator:latest
101+
image: gcr.io/cloud-spanner-emulator/emulator
102102
ports:
103103
- 9010:9010
104104

@@ -123,7 +123,7 @@ jobs:
123123

124124
services:
125125
emulator-0:
126-
image: gcr.io/cloud-spanner-emulator/emulator:latest
126+
image: gcr.io/cloud-spanner-emulator/emulator
127127
ports:
128128
- 9010:9010
129129

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ docs/_build
4848
docs.metadata
4949

5050
# Virtual environment
51+
.venv/
5152
env/
5253
coverage.xml
5354
sponge_log.xml
@@ -59,4 +60,5 @@ system_tests/local_test_setup
5960
pylintrc
6061
pylintrc.test
6162

62-
test.cfg
63+
test.cfg
64+
database

google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414
import base64
15+
import logging
1516

1617
import re
1718

@@ -927,6 +928,18 @@ def _get_table_filter_query(
927928

928929
return table_filter_query
929930

931+
def connect(self, *cargs, **cparams):
932+
conn = super().connect(*cargs, **cparams)
933+
database = getattr(conn, "_database")
934+
if database:
935+
logger = cparams.get("logger")
936+
if logger is None:
937+
logger = logging.getLogger()
938+
database._logger = logger
939+
else:
940+
database._logger = logger
941+
return conn
942+
930943
def create_connect_args(self, url):
931944
"""Parse connection args from the given URL.
932945

requirements.txt

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ build==1.2.2.post1 \
1414
# via
1515
# -r requirements.in
1616
# pip-tools
17-
cachetools==6.1.0 \
18-
--hash=sha256:1c7bb3cf9193deaf3508b7c5f2a79986c13ea38965c5adcff1f84519cf39163e \
19-
--hash=sha256:b4c4f404392848db3ce7aac34950d17be4d864da4b8b66911008e430bc544587
17+
cachetools==5.5.2 \
18+
--hash=sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4 \
19+
--hash=sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a
2020
# via google-auth
2121
certifi==2025.6.15 \
2222
--hash=sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057 \
@@ -144,9 +144,9 @@ google-cloud-core==2.4.3 \
144144
--hash=sha256:1fab62d7102844b278fe6dead3af32408b1df3eb06f5c7e8634cbd40edc4da53 \
145145
--hash=sha256:5130f9f4c14b4fafdff75c79448f9495cfade0d8775facf1b09c3bf67e027f6e
146146
# via google-cloud-spanner
147-
google-cloud-spanner==3.56.0 \
148-
--hash=sha256:64f732a44f6a2892b5cc3be88e6e2cc92b5e52db883d1e946e1e3ff93c9745f0 \
149-
--hash=sha256:bf7e4359d2f2148eda18a11f909813d07e794347a02f56dfbbd544418d30e5b2
147+
google-cloud-spanner==3.57.0 \
148+
--hash=sha256:5b10b40bc646091f1b4cbb2e7e2e82ec66bcce52c7105f86b65070d34d6df86f \
149+
--hash=sha256:73f52f58617449fcff7073274a7f7a798f4f7b2788eda26de3b7f98ad857ab99
150150
# via -r requirements.in
151151
googleapis-common-protos[grpc]==1.70.0 \
152152
--hash=sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257 \
@@ -372,9 +372,9 @@ opentelemetry-sdk==1.34.1 \
372372
--hash=sha256:308effad4059562f1d92163c61c8141df649da24ce361827812c40abb2a1e96e \
373373
--hash=sha256:8091db0d763fcd6098d4781bbc80ff0971f94e260739aa6afe6fd379cdf3aa4d
374374
# via -r requirements.in
375-
opentelemetry-semantic-conventions==0.54b1 \
376-
--hash=sha256:29dab644a7e435b58d3a3918b58c333c92686236b30f7891d5e51f02933ca60d \
377-
--hash=sha256:d1cecedae15d19bdaafca1e56b29a66aa286f50b5d08f036a145c7f3e9ef9cee
375+
opentelemetry-semantic-conventions==0.55b1 \
376+
--hash=sha256:5da81dfdf7d52e3d37f8fe88d5e771e191de924cfff5f550ab0b8f7b2409baed \
377+
--hash=sha256:ef95b1f009159c28d7a7849f5cbc71c4c34c845bb514d66adfdf1b3fff3598b3
378378
# via opentelemetry-sdk
379379
packaging==25.0 \
380380
--hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 \
@@ -396,18 +396,16 @@ proto-plus==1.26.1 \
396396
# via
397397
# google-api-core
398398
# google-cloud-spanner
399-
protobuf==5.29.5 \
400-
--hash=sha256:3f1c6468a2cfd102ff4703976138844f78ebd1fb45f49011afc5139e9e283079 \
401-
--hash=sha256:3f76e3a3675b4a4d867b52e4a5f5b78a2ef9565549d4037e06cf7b0942b1d3fc \
402-
--hash=sha256:470f3af547ef17847a28e1f47200a1cbf0ba3ff57b7de50d22776607cd2ea353 \
403-
--hash=sha256:63848923da3325e1bf7e9003d680ce6e14b07e55d0473253a690c3a8b8fd6e61 \
404-
--hash=sha256:6cf42630262c59b2d8de33954443d94b746c952b01434fc58a417fdbd2e84bd5 \
405-
--hash=sha256:6f642dc9a61782fa72b90878af134c5afe1917c89a568cd3476d758d3c3a0736 \
406-
--hash=sha256:7318608d56b6402d2ea7704ff1e1e4597bee46d760e7e4dd42a3d45e24b87f2e \
407-
--hash=sha256:bc1463bafd4b0929216c35f437a8e28731a2b7fe3d98bb77a600efced5a15c84 \
408-
--hash=sha256:e38c5add5a311f2a6eb0340716ef9b039c1dfa428b28f25a7838ac329204a671 \
409-
--hash=sha256:ef91363ad4faba7b25d844ef1ada59ff1604184c0bcd8b39b8a6bef15e1af238 \
410-
--hash=sha256:fa18533a299d7ab6c55a238bf8629311439995f2e7eca5caaff08663606e9015
399+
protobuf==6.32.0 \
400+
--hash=sha256:15eba1b86f193a407607112ceb9ea0ba9569aed24f93333fe9a497cf2fda37d3 \
401+
--hash=sha256:501fe6372fd1c8ea2a30b4d9be8f87955a64d6be9c88a973996cef5ef6f0abf1 \
402+
--hash=sha256:75a2aab2bd1aeb1f5dc7c5f33bcb11d82ea8c055c9becbb41c26a8c43fd7092c \
403+
--hash=sha256:7db8ed09024f115ac877a1427557b838705359f047b2ff2f2b2364892d19dacb \
404+
--hash=sha256:84f9e3c1ff6fb0308dbacb0950d8aa90694b0d0ee68e75719cb044b7078fe741 \
405+
--hash=sha256:a81439049127067fc49ec1d36e25c6ee1d1a2b7be930675f919258d03c04e7d2 \
406+
--hash=sha256:a8bdbb2f009cfc22a36d031f22a625a38b615b5e19e558a7b756b3279723e68e \
407+
--hash=sha256:ba377e5b67b908c8f3072a57b63e2c6a4cbd18aea4ed98d2584350dbf46f2783 \
408+
--hash=sha256:d52691e5bee6c860fff9a1c86ad26a13afbeb4b168cd4445c922b7e2cf85aaf0
411409
# via
412410
# google-api-core
413411
# google-cloud-spanner
@@ -547,7 +545,9 @@ typing-extensions==4.14.0 \
547545
--hash=sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af
548546
# via
549547
# alembic
548+
# opentelemetry-api
550549
# opentelemetry-sdk
550+
# opentelemetry-semantic-conventions
551551
# sqlalchemy
552552
urllib3==2.5.0 \
553553
--hash=sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760 \
@@ -637,9 +637,7 @@ wrapt==1.17.2 \
637637
--hash=sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119 \
638638
--hash=sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b \
639639
--hash=sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58
640-
# via
641-
# deprecated
642-
# opentelemetry-instrumentation
640+
# via opentelemetry-instrumentation
643641
zipp==3.23.0 \
644642
--hash=sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e \
645643
--hash=sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166

samples/sample_helper.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def start_emulator() -> (DockerContainer, str):
4949
).with_exposed_ports(9010)
5050
emulator.start()
5151
wait_for_logs(emulator, "gRPC server listening at 0.0.0.0:9010")
52-
port = emulator.get_exposed_port(9010)
52+
port = str(emulator.get_exposed_port(9010))
5353
_create_instance_and_database(port)
5454
return emulator, port
5555

test/mockserver_tests/mock_server_test_base.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14+
import logging
1415

1516
from google.cloud.spanner_dbapi.parsed_statement import AutocommitDmlMode
1617
from sqlalchemy import Engine, create_engine
@@ -22,7 +23,6 @@
2223
from google.cloud.spanner_v1 import (
2324
Client,
2425
ResultSet,
25-
PingingPool,
2626
TypeCode,
2727
)
2828
from google.cloud.spanner_v1.database import Database
@@ -151,6 +151,7 @@ def setup_method(self):
151151
self._client = None
152152
self._instance = None
153153
self._database = None
154+
_ = self.database
154155

155156
def teardown_method(self):
156157
MockServerTestBase.spanner_service.clear_requests()
@@ -159,7 +160,7 @@ def teardown_method(self):
159160
def create_engine(self) -> Engine:
160161
return create_engine(
161162
"spanner:///projects/p/instances/i/databases/d",
162-
connect_args={"client": self.client, "pool": PingingPool(size=10)},
163+
connect_args={"client": self.client},
163164
)
164165

165166
@property
@@ -177,13 +178,13 @@ def client(self) -> Client:
177178
@property
178179
def instance(self) -> Instance:
179180
if self._instance is None:
180-
self._instance = self.client.instance("test-instance")
181+
self._instance = self.client.instance("i")
181182
return self._instance
182183

183184
@property
184185
def database(self) -> Database:
186+
logger = logging.getLogger("level warning")
187+
logger.setLevel(logging.WARN)
185188
if self._database is None:
186-
self._database = self.instance.database(
187-
"test-database", pool=PingingPool(size=10)
188-
)
189+
self._database = self.instance.database("d", logger=logger)
189190
return self._database

test/mockserver_tests/test_auto_increment.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@
1616
from sqlalchemy.orm import Session
1717
from sqlalchemy.testing import eq_, is_instance_of
1818
from google.cloud.spanner_v1 import (
19-
FixedSizePool,
2019
ResultSet,
21-
BatchCreateSessionsRequest,
20+
CreateSessionRequest,
2221
ExecuteSqlRequest,
2322
CommitRequest,
2423
BeginTransactionRequest,
@@ -47,7 +46,7 @@ def test_create_table(self):
4746
)
4847
engine = create_engine(
4948
"spanner:///projects/p/instances/i/databases/d",
50-
connect_args={"client": self.client, "pool": FixedSizePool(size=10)},
49+
connect_args={"client": self.client},
5150
)
5251
Base.metadata.create_all(engine)
5352
requests = self.database_admin_service.requests
@@ -76,7 +75,7 @@ def test_create_auto_increment_table(self):
7675
)
7776
engine = create_engine(
7877
"spanner:///projects/p/instances/i/databases/d",
79-
connect_args={"client": self.client, "pool": FixedSizePool(size=10)},
78+
connect_args={"client": self.client},
8079
)
8180
engine.dialect.use_auto_increment = True
8281
Base.metadata.create_all(engine)
@@ -105,7 +104,7 @@ def test_create_table_with_specific_sequence_kind(self):
105104
)
106105
engine = create_engine(
107106
"spanner:///projects/p/instances/i/databases/d",
108-
connect_args={"client": self.client, "pool": FixedSizePool(size=10)},
107+
connect_args={"client": self.client},
109108
)
110109
engine.dialect.default_sequence_kind = "non_existing_kind"
111110
Base.metadata.create_all(engine)
@@ -128,7 +127,7 @@ def test_insert_row(self):
128127
self.add_insert_result("INSERT INTO singers (name) VALUES (@a0) THEN RETURN id")
129128
engine = create_engine(
130129
"spanner:///projects/p/instances/i/databases/d",
131-
connect_args={"client": self.client, "pool": FixedSizePool(size=10)},
130+
connect_args={"client": self.client},
132131
)
133132

134133
with Session(engine) as session:
@@ -141,7 +140,7 @@ def test_insert_row(self):
141140
# Verify the requests that we got.
142141
requests = self.spanner_service.requests
143142
eq_(4, len(requests))
144-
is_instance_of(requests[0], BatchCreateSessionsRequest)
143+
is_instance_of(requests[0], CreateSessionRequest)
145144
is_instance_of(requests[1], BeginTransactionRequest)
146145
is_instance_of(requests[2], ExecuteSqlRequest)
147146
is_instance_of(requests[3], CommitRequest)
@@ -154,7 +153,7 @@ def test_insert_row_with_pk_value(self):
154153
add_update_count("INSERT INTO singers (id, name) VALUES (@a0, @a1)", 1)
155154
engine = create_engine(
156155
"spanner:///projects/p/instances/i/databases/d",
157-
connect_args={"client": self.client, "pool": FixedSizePool(size=10)},
156+
connect_args={"client": self.client},
158157
)
159158

160159
with Session(engine) as session:

test/mockserver_tests/test_basics.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# limitations under the License.
1414

1515
import datetime
16+
1617
from google.cloud.spanner_admin_database_v1 import UpdateDatabaseDdlRequest
1718
from google.cloud.spanner_dbapi.parsed_statement import AutocommitDmlMode
1819
from sqlalchemy import (
@@ -32,8 +33,7 @@
3233
from sqlalchemy.orm import Session, DeclarativeBase, Mapped, mapped_column
3334
from sqlalchemy.testing import eq_, is_instance_of
3435
from google.cloud.spanner_v1 import (
35-
FixedSizePool,
36-
BatchCreateSessionsRequest,
36+
CreateSessionRequest,
3737
ExecuteSqlRequest,
3838
ResultSet,
3939
PingingPool,
@@ -58,7 +58,7 @@ def verify_select1(self, results):
5858
eq_(1, len(result_list))
5959
requests = self.spanner_service.requests
6060
eq_(2, len(requests))
61-
is_instance_of(requests[0], BatchCreateSessionsRequest)
61+
is_instance_of(requests[0], CreateSessionRequest)
6262
is_instance_of(requests[1], ExecuteSqlRequest)
6363

6464
def test_select1(self):
@@ -71,7 +71,7 @@ def test_sqlalchemy_select1(self):
7171
add_select1_result()
7272
engine = create_engine(
7373
"spanner:///projects/p/instances/i/databases/d",
74-
connect_args={"client": self.client, "pool": PingingPool(size=10)},
74+
connect_args={"client": self.client},
7575
)
7676
with engine.connect().execution_options(
7777
isolation_level="AUTOCOMMIT"
@@ -113,7 +113,7 @@ def test_create_table(self):
113113
)
114114
engine = create_engine(
115115
"spanner:///projects/p/instances/i/databases/d",
116-
connect_args={"client": self.client, "pool": FixedSizePool(size=10)},
116+
connect_args={"client": self.client},
117117
)
118118
metadata = MetaData()
119119
Table(
@@ -150,7 +150,7 @@ def test_create_table_in_schema(self):
150150
)
151151
engine = create_engine(
152152
"spanner:///projects/p/instances/i/databases/d",
153-
connect_args={"client": self.client, "pool": FixedSizePool(size=10)},
153+
connect_args={"client": self.client},
154154
)
155155
metadata = MetaData()
156156
Table(
@@ -192,7 +192,7 @@ def test_create_multiple_tables(self):
192192
)
193193
engine = create_engine(
194194
"spanner:///projects/p/instances/i/databases/d",
195-
connect_args={"client": self.client, "pool": FixedSizePool(size=10)},
195+
connect_args={"client": self.client},
196196
)
197197
metadata = MetaData()
198198
for i in range(2):
@@ -260,7 +260,7 @@ class Singer(Base):
260260

261261
engine = create_engine(
262262
"spanner:///projects/p/instances/i/databases/d",
263-
connect_args={"client": self.client, "pool": FixedSizePool(size=10)},
263+
connect_args={"client": self.client},
264264
)
265265

266266
with Session(engine) as session:
@@ -277,18 +277,18 @@ def test_database_role(self):
277277
"spanner:///projects/p/instances/i/databases/d",
278278
connect_args={
279279
"client": self.client,
280-
"pool": FixedSizePool(size=10),
280+
# "pool": FixedSizePool(size=10),
281281
"database_role": "my_role",
282282
},
283283
)
284284
with Session(engine.execution_options(isolation_level="autocommit")) as session:
285285
session.execute(select(1))
286286
requests = self.spanner_service.requests
287287
eq_(2, len(requests))
288-
is_instance_of(requests[0], BatchCreateSessionsRequest)
288+
is_instance_of(requests[0], CreateSessionRequest)
289289
is_instance_of(requests[1], ExecuteSqlRequest)
290-
request: BatchCreateSessionsRequest = requests[0]
291-
eq_("my_role", request.session_template.creator_role)
290+
request: CreateSessionRequest = requests[0]
291+
eq_("my_role", request.session.creator_role)
292292

293293
def test_select_table_in_named_schema(self):
294294
class Base(DeclarativeBase):
@@ -311,7 +311,7 @@ class Singer(Base):
311311
add_singer_query_result(query)
312312
engine = create_engine(
313313
"spanner:///projects/p/instances/i/databases/d",
314-
connect_args={"client": self.client, "pool": FixedSizePool(size=10)},
314+
connect_args={"client": self.client},
315315
)
316316

317317
insert = "INSERT INTO my_schema.singers (name) VALUES (@a0) THEN RETURN id"

0 commit comments

Comments
 (0)