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

Commit e873ba1

Browse files
committed
test: add mock server tests to guarantee exact SQL generation
1 parent 99cc6f9 commit e873ba1

File tree

2 files changed

+53
-1
lines changed

2 files changed

+53
-1
lines changed

google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,9 @@ def visit_table(self, table, spanner_aliased=False, iscrud=False, **kwargs):
421421
if spanner_aliased is table or self.isinsert:
422422
return super().visit_table(table, **kwargs)
423423

424-
# alias schema-qualified tables
424+
# Add an alias for schema-qualified tables.
425+
# Tables in the default schema are not aliased and follow the
426+
# standard SQLAlchemy code path.
425427
alias = self._schema_aliased_table(table)
426428
if alias is not None:
427429
return self.process(alias, spanner_aliased=table, **kwargs)

test/mockserver_tests/test_basics.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,3 +262,53 @@ class Singer(Base):
262262
singer.name = "New Name"
263263
session.add(singer)
264264
session.commit()
265+
266+
def test_select_table_in_named_schema(self):
267+
class Base(DeclarativeBase):
268+
pass
269+
270+
class Singer(Base):
271+
__tablename__ = "singers"
272+
__table_args__ = {"schema": "my_schema"}
273+
id: Mapped[int] = mapped_column(BigInteger, primary_key=True)
274+
name: Mapped[str] = mapped_column(String)
275+
276+
query = (
277+
"SELECT"
278+
" singers_1.id AS my_schema_singers_id,"
279+
" singers_1.name AS my_schema_singers_name\n"
280+
"FROM my_schema.singers AS singers_1\n"
281+
"WHERE singers_1.id = @a0\n"
282+
" LIMIT @a1"
283+
)
284+
add_singer_query_result(query)
285+
engine = create_engine(
286+
"spanner:///projects/p/instances/i/databases/d",
287+
connect_args={"client": self.client, "pool": FixedSizePool(size=10)},
288+
)
289+
290+
insert = "INSERT INTO my_schema.singers (name) VALUES (@a0) THEN RETURN id"
291+
add_single_result(insert, "id", TypeCode.INT64, [("1",)])
292+
with Session(engine) as session:
293+
singer = Singer(name="New Name")
294+
session.add(singer)
295+
session.commit()
296+
297+
update = (
298+
"UPDATE my_schema.singers AS singers_1 "
299+
"SET name=@a0 "
300+
"WHERE singers_1.id = @a1"
301+
)
302+
add_update_count(update, 1)
303+
with Session(engine) as session:
304+
singer = session.query(Singer).filter(Singer.id == 1).first()
305+
singer.name = "New Name"
306+
session.add(singer)
307+
session.commit()
308+
309+
delete = "DELETE FROM my_schema.singers AS singers_1 WHERE singers_1.id = @a0"
310+
add_update_count(delete, 1)
311+
with Session(engine) as session:
312+
singer = session.query(Singer).filter(Singer.id == 1).first()
313+
session.delete(singer)
314+
session.commit()

0 commit comments

Comments
 (0)