ATRIUMsearch → argument graph

first-hand human knowledge

Attention is all that matters.

We read the podcasts, essays and interviews — and hand you the arguments: who claims what, who rebuts, and the original voice one click away.

MechanismArticle

Table.delete_where() never wraps its DELETE in a transaction, so it fails to commit and leaves the database connection permanently poisoned, causing silent data loss on subsequent operations.

Claude Fable's pre-release review found that Table.delete_where() executes its DELETE without an atomic() wrapper, leaving the connection stuck 'in_transaction', which silently rolls back that delete plus any later writes—even to unrelated tables—when the connection closes.

Claude Fable · Simon Willison's Weblog
DefinitionArticle

Every write method in sqlite-utils runs inside and commits its own transaction automatically, so changes are saved to disk as soon as the method call finishes, without needing an explicit commit().

The 4.0rc2 documentation clarifies that insert(), upsert(), update(), delete() and other write methods each commit their own transaction immediately, and that explicit transaction control (db.atomic() or db.begin()) is only needed for grouping multiple writes or manual management.

AnecdoteArticle

sqlite-utils's automatic transaction handling was fundamentally incompatible with connections created using Python 3.12's new autocommit=True/False options, which broke nearly the entire test suite once discovered.

Simon Willison admits he hadn't considered Python 3.12's new autocommit connection modes; testing with Fable revealed that db.atomic() and per-method auto-commits broke almost the whole test suite on such connections, requiring a fix so the library would explicitly reject them.

Simon Willison · Simon Willison's Weblog
FactArticle

sqlite-utils's db.query() commits a rejected write statement to the database before raising the ValueError that says the statement was disallowed, so the write takes effect despite the error.

GPT-5.5's review of the release candidate found that db.query() calls db.execute() (which auto-commits) before it checks whether the statement returns rows, so db.query("update ...") actually commits the update even though it then raises a ValueError.