Skip to content

Commit

Permalink
Take advantage of execute_write_fn(transaction=True)
Browse files Browse the repository at this point in the history
A bunch of places no longer need to do manual transaction handling
thanks to this change. Refs #2277
  • Loading branch information
simonw committed Feb 18, 2024
1 parent 5e0e440 commit 10f9ba1
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 26 deletions.
9 changes: 3 additions & 6 deletions datasette/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,17 +123,15 @@ def close(self):

async def execute_write(self, sql, params=None, block=True):
def _inner(conn):
with conn:
return conn.execute(sql, params or [])
return conn.execute(sql, params or [])

with trace("sql", database=self.name, sql=sql.strip(), params=params):
results = await self.execute_write_fn(_inner, block=block)
return results

async def execute_write_script(self, sql, block=True):
def _inner(conn):
with conn:
return conn.executescript(sql)
return conn.executescript(sql)

with trace("sql", database=self.name, sql=sql.strip(), executescript=True):
results = await self.execute_write_fn(_inner, block=block)
Expand All @@ -149,8 +147,7 @@ def count_params(params):
count += 1
yield param

with conn:
return conn.executemany(sql, count_params(params_seq)), count
return conn.executemany(sql, count_params(params_seq)), count

with trace(
"sql", database=self.name, sql=sql.strip(), executemany=True
Expand Down
27 changes: 13 additions & 14 deletions datasette/utils/internal_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,20 +69,19 @@ async def populate_schema_tables(internal_db, db):
database_name = db.name

def delete_everything(conn):
with conn:
conn.execute(
"DELETE FROM catalog_tables WHERE database_name = ?", [database_name]
)
conn.execute(
"DELETE FROM catalog_columns WHERE database_name = ?", [database_name]
)
conn.execute(
"DELETE FROM catalog_foreign_keys WHERE database_name = ?",
[database_name],
)
conn.execute(
"DELETE FROM catalog_indexes WHERE database_name = ?", [database_name]
)
conn.execute(
"DELETE FROM catalog_tables WHERE database_name = ?", [database_name]
)
conn.execute(
"DELETE FROM catalog_columns WHERE database_name = ?", [database_name]
)
conn.execute(
"DELETE FROM catalog_foreign_keys WHERE database_name = ?",
[database_name],
)
conn.execute(
"DELETE FROM catalog_indexes WHERE database_name = ?", [database_name]
)

await internal_db.execute_write_fn(delete_everything)

Expand Down
10 changes: 4 additions & 6 deletions tests/test_internals_database.py
Original file line number Diff line number Diff line change
Expand Up @@ -501,9 +501,8 @@ async def test_execute_write_has_correctly_prepared_connection(db):
@pytest.mark.asyncio
async def test_execute_write_fn_block_false(db):
def write_fn(conn):
with conn:
conn.execute("delete from roadside_attractions where pk = 1;")
row = conn.execute("select count(*) from roadside_attractions").fetchone()
conn.execute("delete from roadside_attractions where pk = 1;")
row = conn.execute("select count(*) from roadside_attractions").fetchone()
return row[0]

task_id = await db.execute_write_fn(write_fn, block=False)
Expand All @@ -513,9 +512,8 @@ def write_fn(conn):
@pytest.mark.asyncio
async def test_execute_write_fn_block_true(db):
def write_fn(conn):
with conn:
conn.execute("delete from roadside_attractions where pk = 1;")
row = conn.execute("select count(*) from roadside_attractions").fetchone()
conn.execute("delete from roadside_attractions where pk = 1;")
row = conn.execute("select count(*) from roadside_attractions").fetchone()
return row[0]

new_count = await db.execute_write_fn(write_fn)
Expand Down

0 comments on commit 10f9ba1

Please sign in to comment.