LINUX.ORG.RU

Как в sqlite3 запретить неявное открытие транзакции?

 ,


0

2

Как в sqlite3, в частности при использовании в питоне, запретить неявное открытие транзакции на запись? Чтобы при попытке что-либо записать без явного BEGIN вываливалось в исключение?

Ответ на: комментарий от t184256

Это не работает. По крайней мере ошибку не бросает. Там по ссылке так же написано, что в версиях от 3.6 это поменялось, хотя не понятно, который из пунктов. А в 3.12 говорят нужно все через autocommit, а этот атрибут у меня вообще отсутсвует. У меня версия 3.37.2

В итоге сделал такие методы в обертке:

    @classmethod
    def change(cls, rq, params=()):
        conn = cls.__dbConnection()
        assert conn.in_transaction
        tc0 = conn.total_changes
        conn.execute(rq, params)
        return conn.total_changes - tc0

    @classmethod
    def execute(cls, rq, params=()):
        conn = cls.__dbConnection()
        dbg_tc = conn.total_changes
        dbg_was_t = conn.in_transaction
        res = conn.execute(rq, params)
        assert dbg_tc == conn.total_changes
        assert dbg_was_t == conn.in_transaction
        return res

Ну и всякие там begin, commit, rollback. В итоге получился ручной контроль транзакций.

victor79
() автор топика
Ответ на: комментарий от t184256

Версия чего?

У меня такие версии в файле _sqlite3.py:

sqlite_version = '3.37.2'
version = '2.6.0'

На сайте описание для DB-API 2.0, вероятно то что у меня version=2.6 это версия этой апи.

Но версия python3 is 3.10.12, значит на сайте это версии питона, а не sqlite. Вопрос отсутствия autocommit стал понятным.

victor79
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.