The Storm ORM struggles with sqlite3's transaction behaviour as they explain in their source code. Looking at the implementation of
.raw_execute() the side effect of their solution to this is that they start an explicit transaction on every statement that gets executed. Including
This, in turn, sucks big time. If you look at sqlite's locking behviour you will find that it should be possible to read from the database using concurrent connections (i.e. from multiple processes and/or threads at the same time). However since storm explicitly starts that transaction for a select it means the connection doing the read now holds a
SHARED lock until you end the transaction (by doing a commit or rollback). But since it's holding this shared lock, for no good reason, it means no other connection can acquire the
EXCLUSIVE lock at the same time.
The upshot of this seems to be that you need to call
.commit() even after just reading the database, thus ensuring you let go of the shared lock. Can't say I like that.