Skip to content
This repository was archived by the owner on Aug 19, 2025. It is now read-only.

Commit 9ed76b3

Browse files
Build queries before acquiring the lock (#199)
* Build queries before acquiring the lock * Update core.py Co-authored-by: Tom Christie <tom@tomchristie.com>
1 parent 10ec976 commit 9ed76b3

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

databases/core.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -232,30 +232,34 @@ async def __aexit__(
232232
async def fetch_all(
233233
self, query: typing.Union[ClauseElement, str], values: dict = None
234234
) -> typing.List[typing.Mapping]:
235+
built_query = self._build_query(query, values)
235236
async with self._query_lock:
236-
return await self._connection.fetch_all(self._build_query(query, values))
237+
return await self._connection.fetch_all(built_query)
237238

238239
async def fetch_one(
239240
self, query: typing.Union[ClauseElement, str], values: dict = None
240241
) -> typing.Optional[typing.Mapping]:
242+
built_query = self._build_query(query, values)
241243
async with self._query_lock:
242-
return await self._connection.fetch_one(self._build_query(query, values))
244+
return await self._connection.fetch_one(built_query)
243245

244246
async def fetch_val(
245247
self,
246248
query: typing.Union[ClauseElement, str],
247249
values: dict = None,
248250
column: typing.Any = 0,
249251
) -> typing.Any:
252+
built_query = self._build_query(query, values)
250253
async with self._query_lock:
251-
row = await self._connection.fetch_one(self._build_query(query, values))
254+
row = await self._connection.fetch_one(built_query)
252255
return None if row is None else row[column]
253256

254257
async def execute(
255258
self, query: typing.Union[ClauseElement, str], values: dict = None
256259
) -> typing.Any:
260+
built_query = self._build_query(query, values)
257261
async with self._query_lock:
258-
return await self._connection.execute(self._build_query(query, values))
262+
return await self._connection.execute(built_query)
259263

260264
async def execute_many(
261265
self, query: typing.Union[ClauseElement, str], values: list
@@ -267,11 +271,10 @@ async def execute_many(
267271
async def iterate(
268272
self, query: typing.Union[ClauseElement, str], values: dict = None
269273
) -> typing.AsyncGenerator[typing.Any, None]:
274+
built_query = self._build_query(query, values)
270275
async with self.transaction():
271276
async with self._query_lock:
272-
async for record in self._connection.iterate(
273-
self._build_query(query, values)
274-
):
277+
async for record in self._connection.iterate(built_query):
275278
yield record
276279

277280
def transaction(self, *, force_rollback: bool = False) -> "Transaction":
@@ -466,8 +469,8 @@ def replace(self, **kwargs: typing.Any) -> "DatabaseURL":
466469
kwargs["scheme"] = f"{dialect}+{driver}" if driver else dialect
467470

468471
if not kwargs.get("netloc", self.netloc):
469-
# Using an empty string that evaluates as True means we end
470-
# up with URLs like `sqlite:///database` instead of `sqlite:/database`
472+
# Using an empty string that evaluates as True means we end up
473+
# with URLs like `sqlite:///database` instead of `sqlite:/database`
471474
kwargs["netloc"] = _EmptyNetloc()
472475

473476
components = self.components._replace(**kwargs)

0 commit comments

Comments
 (0)