Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions .github/workflows/unittest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ env:
NOX_ENVDIR: "/tmp/shared_nox_envs"
NOX_DEFAULT_VENV_BACKEND: "uv"
UV_VENV_SEED: "1"
UV_PRERELEASE: "allow"
# Prefer stable versions, falling back to pre-releases only when no stable version exists
UV_PRERELEASE: "if-necessary"
# Note: PARALLEL_WORKERS must remain "1" for unit tests because running pytest concurrently
# on the same runner VM can cause socket/IPC/process deadlocks across packages.
PARALLEL_WORKERS: "1"
Expand Down Expand Up @@ -124,7 +125,7 @@ jobs:
with:
python-version: ${{ matrix.python }}
cache: 'pip'
allow-prereleases: true
allow-prereleases: ${{ matrix.python == '3.15' }}
- name: Setup uv
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
with:
Expand Down Expand Up @@ -198,7 +199,7 @@ jobs:
with:
python-version: ${{ matrix.python }}
cache: 'pip'
allow-prereleases: true
allow-prereleases: false
- name: Install nox
run: |
pip install nox
Expand Down
31 changes: 24 additions & 7 deletions packages/sqlalchemy-spanner/tests/mockserver_tests/test_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class TestStaleReads(MockServerTestBase):
def test_request_tag(self):
from tests.mockserver_tests.tags_model import Singer

add_singer_query_result("SELECT singers.id, singers.name \n" + "FROM singers")
add_singer_query_result()
engine = self.create_engine()

with Session(engine.execution_options(read_only=True)) as session:
Expand All @@ -61,10 +61,8 @@ def test_request_tag(self):
def test_transaction_tag(self):
from tests.mockserver_tests.tags_model import Singer

add_singer_query_result("SELECT singers.id, singers.name\n" + "FROM singers")
add_single_singer_query_result(
"SELECT singers.id, singers.name\nFROM singers\nWHERE singers.id = @a0"
)
add_singer_query_result()
add_single_singer_query_result()
add_update_count("INSERT INTO singers (id, name) VALUES (@a0, @a1)", 1)
engine = self.create_engine()

Expand Down Expand Up @@ -129,7 +127,18 @@ def empty_singer_result_set():
)


def add_singer_query_result(sql: str):
def has_column_aliases() -> bool:
# Older SQLAlchemy 2.0.x versions compiled ORM column selections with explicit
# labels (e.g., 'singers.id AS singers_id'), whereas newer 2.0.x and 2.1+ releases
# omit redundant column aliases in unaliased single-table queries.
from tests.mockserver_tests.tags_model import Singer

return "AS singers_id" in str(select(Singer))


def add_singer_query_result():
sql = "SELECT singers.id, singers.name\nFROM singers"

result = empty_singer_result_set()
result.rows.extend(
[
Expand All @@ -146,7 +155,15 @@ def add_singer_query_result(sql: str):
add_result(sql, result)


def add_single_singer_query_result(sql: str):
def add_single_singer_query_result():
if has_column_aliases():
sql = (
"SELECT singers.id AS singers_id, singers.name AS singers_name"
+ "\nFROM singers\nWHERE singers.id = @a0"
)
else:
sql = "SELECT singers.id, singers.name\nFROM singers\nWHERE singers.id = @a0"

result = empty_singer_result_set()
result.rows.extend(
[
Expand Down
Loading