Skip to content

Commit 5fae04e

Browse files
fix: accept Sequence[Any] for params, not just list[Any]
The wire layer already accepts Sequence[Any] for parameters. The client's list[Any] annotation was unnecessarily restrictive, causing mypy errors when users passed tuples like (1, "hello"). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 282f2b4 commit 5fae04e

3 files changed

Lines changed: 12 additions & 11 deletions

File tree

src/dqliteclient/connection.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""High-level connection interface for dqlite."""
22

33
import asyncio
4-
from collections.abc import AsyncIterator
4+
from collections.abc import AsyncIterator, Sequence
55
from contextlib import asynccontextmanager
66
from typing import Any
77

@@ -97,7 +97,7 @@ def _invalidate(self) -> None:
9797
self._protocol = None
9898
self._db_id = None
9999

100-
async def execute(self, sql: str, params: list[Any] | None = None) -> tuple[int, int]:
100+
async def execute(self, sql: str, params: Sequence[Any] | None = None) -> tuple[int, int]:
101101
"""Execute a SQL statement.
102102
103103
Returns (last_insert_id, rows_affected).
@@ -109,7 +109,7 @@ async def execute(self, sql: str, params: list[Any] | None = None) -> tuple[int,
109109
self._invalidate()
110110
raise
111111

112-
async def fetch(self, sql: str, params: list[Any] | None = None) -> list[dict[str, Any]]:
112+
async def fetch(self, sql: str, params: Sequence[Any] | None = None) -> list[dict[str, Any]]:
113113
"""Execute a query and return results as list of dicts."""
114114
protocol, db_id = self._ensure_connected()
115115
try:
@@ -119,7 +119,7 @@ async def fetch(self, sql: str, params: list[Any] | None = None) -> list[dict[st
119119
raise
120120
return [dict(zip(columns, row, strict=True)) for row in rows]
121121

122-
async def fetchall(self, sql: str, params: list[Any] | None = None) -> list[list[Any]]:
122+
async def fetchall(self, sql: str, params: Sequence[Any] | None = None) -> list[list[Any]]:
123123
"""Execute a query and return results as list of lists."""
124124
protocol, db_id = self._ensure_connected()
125125
try:
@@ -129,12 +129,12 @@ async def fetchall(self, sql: str, params: list[Any] | None = None) -> list[list
129129
raise
130130
return rows
131131

132-
async def fetchone(self, sql: str, params: list[Any] | None = None) -> dict[str, Any] | None:
132+
async def fetchone(self, sql: str, params: Sequence[Any] | None = None) -> dict[str, Any] | None:
133133
"""Execute a query and return the first result."""
134134
results = await self.fetch(sql, params)
135135
return results[0] if results else None
136136

137-
async def fetchval(self, sql: str, params: list[Any] | None = None) -> Any:
137+
async def fetchval(self, sql: str, params: Sequence[Any] | None = None) -> Any:
138138
"""Execute a query and return the first column of the first row."""
139139
protocol, db_id = self._ensure_connected()
140140
try:

src/dqliteclient/pool.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""Connection pooling for dqlite."""
22

33
import asyncio
4-
from collections.abc import AsyncIterator
4+
from collections.abc import AsyncIterator, Sequence
55
from contextlib import asynccontextmanager
66
from typing import Any
77

@@ -99,12 +99,12 @@ async def acquire(self) -> AsyncIterator[DqliteConnection]:
9999
await conn.close()
100100
self._size -= 1
101101

102-
async def execute(self, sql: str, params: list[Any] | None = None) -> tuple[int, int]:
102+
async def execute(self, sql: str, params: Sequence[Any] | None = None) -> tuple[int, int]:
103103
"""Execute a SQL statement using a pooled connection."""
104104
async with self.acquire() as conn:
105105
return await conn.execute(sql, params)
106106

107-
async def fetch(self, sql: str, params: list[Any] | None = None) -> list[dict[str, Any]]:
107+
async def fetch(self, sql: str, params: Sequence[Any] | None = None) -> list[dict[str, Any]]:
108108
"""Execute a query using a pooled connection."""
109109
async with self.acquire() as conn:
110110
return await conn.fetch(sql, params)

src/dqliteclient/protocol.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Low-level protocol handler for dqlite."""
22

33
import asyncio
4+
from collections.abc import Sequence
45
from typing import Any
56

67
from dqliteclient.exceptions import DqliteConnectionError, OperationalError, ProtocolError
@@ -136,7 +137,7 @@ async def finalize(self, db_id: int, stmt_id: int) -> None:
136137
raise OperationalError(response.code, response.message)
137138

138139
async def exec_sql(
139-
self, db_id: int, sql: str, params: list[Any] | None = None
140+
self, db_id: int, sql: str, params: Sequence[Any] | None = None
140141
) -> tuple[int, int]:
141142
"""Execute SQL directly.
142143
@@ -157,7 +158,7 @@ async def exec_sql(
157158
return response.last_insert_id, response.rows_affected
158159

159160
async def query_sql(
160-
self, db_id: int, sql: str, params: list[Any] | None = None
161+
self, db_id: int, sql: str, params: Sequence[Any] | None = None
161162
) -> tuple[list[str], list[list[Any]]]:
162163
"""Execute a query directly.
163164

0 commit comments

Comments
 (0)