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

Commit 7ad2cd0

Browse files
Merge pull request #43 from encode/return-val-from-execute
Return result from execute
2 parents ae55f0c + dbf21c4 commit 7ad2cd0

File tree

6 files changed

+28
-7
lines changed

6 files changed

+28
-7
lines changed

databases/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from databases.core import Database, DatabaseURL
22

33

4-
__version__ = "0.1.4"
4+
__version__ = "0.1.5"
55
__all__ = ["Database", "DatabaseURL"]

databases/backends/mysql.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,15 @@ async def fetch_one(self, query: ClauseElement) -> RowProxy:
9292
finally:
9393
await cursor.close()
9494

95-
async def execute(self, query: ClauseElement, values: dict = None) -> None:
95+
async def execute(self, query: ClauseElement, values: dict = None) -> typing.Any:
9696
assert self._connection is not None, "Connection is not acquired"
9797
if values is not None:
9898
query = query.values(values)
9999
query, args, context = self._compile(query)
100100
cursor = await self._connection.cursor()
101101
try:
102102
await cursor.execute(query, args)
103+
return cursor.lastrowid
103104
finally:
104105
await cursor.close()
105106

databases/backends/postgres.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,12 @@ async def fetch_one(self, query: ClauseElement) -> typing.Any:
9999
row = await self._connection.fetchrow(query, *args)
100100
return Record(row, result_columns, self._dialect)
101101

102-
async def execute(self, query: ClauseElement, values: dict = None) -> None:
102+
async def execute(self, query: ClauseElement, values: dict = None) -> typing.Any:
103103
assert self._connection is not None, "Connection is not acquired"
104104
if values is not None:
105105
query = query.values(values)
106106
query, args, result_columns = self._compile(query)
107-
await self._connection.execute(query, *args)
107+
return await self._connection.fetchval(query, *args)
108108

109109
async def execute_many(self, query: ClauseElement, values: list) -> None:
110110
assert self._connection is not None, "Connection is not acquired"

databases/backends/sqlite.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ async def execute(self, query: ClauseElement, values: dict = None) -> None:
107107
query, args, context = self._compile(query)
108108
cursor = await self._connection.execute(query, args)
109109
await cursor.close()
110+
return cursor.lastrowid
110111

111112
async def execute_many(self, query: ClauseElement, values: list) -> None:
112113
assert self._connection is not None, "Connection is not acquired"

databases/core.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ async def fetch_one(self, query: ClauseElement) -> RowProxy:
9696
async with self.connection() as connection:
9797
return await connection.fetch_one(query=query)
9898

99-
async def execute(self, query: ClauseElement, values: dict = None) -> None:
99+
async def execute(self, query: ClauseElement, values: dict = None) -> typing.Any:
100100
async with self.connection() as connection:
101101
return await connection.execute(query=query, values=values)
102102

@@ -162,8 +162,8 @@ async def fetch_all(self, query: ClauseElement) -> typing.Any:
162162
async def fetch_one(self, query: ClauseElement) -> typing.Any:
163163
return await self._connection.fetch_one(query=query)
164164

165-
async def execute(self, query: ClauseElement, values: dict = None) -> None:
166-
await self._connection.execute(query, values)
165+
async def execute(self, query: ClauseElement, values: dict = None) -> typing.Any:
166+
return await self._connection.execute(query, values)
167167

168168
async def execute_many(self, query: ClauseElement, values: list) -> None:
169169
await self._connection.execute_many(query, values)

tests/test_databases.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,25 @@ async def test_queries(database_url):
151151
assert iterate_results[2]["completed"] == True
152152

153153

154+
@pytest.mark.parametrize("database_url", DATABASE_URLS)
155+
@async_adapter
156+
async def test_execute_return_val(database_url):
157+
"""
158+
Test using return value from `execute()` to get an inserted primary key.
159+
"""
160+
async with Database(database_url) as database:
161+
async with database.transaction(force_rollback=True):
162+
query = notes.insert()
163+
values = {"text": "example1", "completed": True}
164+
pk = await database.execute(query, values)
165+
166+
assert isinstance(pk, int)
167+
query = notes.select().where(notes.c.id == pk)
168+
result = await database.fetch_one(query)
169+
assert result["text"] == "example1"
170+
assert result["completed"] == True
171+
172+
154173
@pytest.mark.parametrize("database_url", DATABASE_URLS)
155174
@async_adapter
156175
async def test_rollback_isolation(database_url):

0 commit comments

Comments
 (0)