OperationalError: cannot VACUUM from within a transaction
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 2.2k
- Forks
- 172
- Avg merge
- 9m
- Merged PRs (30d)
- 1
Description
Maybe when calling .vacuum() and other DB-level write-lock operations sqlite_utils could guard against this error message by automatically committing first?
46 db["media"].optimize() # type: ignore
---> 47 db.vacuum()
File ~/.local/lib/python3.10/site-packages/sqlite_utils/db.py:1047, in Database.vacuum(self)
1045 def vacuum(self):
1046 "Run a SQLite ``VACUUM`` against the database."
-> 1047 self.execute("VACUUM;")
File ~/.local/lib/python3.10/site-packages/sqlite_utils/db.py:470, in Database.execute(self, sql, parameters)
468 return self.conn.execute(sql, parameters)
469 else:
--> 470 return self.conn.execute(sql)
OperationalError: cannot VACUUM from within a transaction
It might also be nice to add a sentence or two about how transactions are committed on the docs page. When I was swapping out my sqlite3 code for this library it was nice that everything was pretty much drop-in but I was/am unsure what to do about the places I explicitly call .commit() in my code
Related to https://github.com/simonw/sqlite-utils/issues/121
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with Database.vacuum() and Database.execute() in sqlite_utils/db.py, especially the lines shown in the traceback, and review the linked transaction documentation section. Determine the expected commit behavior for VACUUM and other database-level write-lock operations, then document how sqlite-utils transactions interact with explicit commits.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python, sqlite
- Domain
- databases, documentation
- Issue type
- Feature
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100