Как выполнять транзакции базы данных с помощью psycopg2 / python db api?

Im возится с psycopg2, и пока есть .commit () и .rollback (), нет .begin () или аналогично, чтобы начать транзакцию, или так кажется? Я ожидал, что смогу сделать

db.begin() # possible even set the isolation level here curs = db.cursor() cursor.execute('select etc... for update') ... cursor.execute('update ... etc.') db.commit(); 

Итак, как работают транзакции с psycopg2? Как установить / изменить уровень изоляции?

  • В Django models.py, в чем разница между значением по умолчанию, нулем и пробелом?
  • App Engine: структурированное свойство vs Ссылка для отношения «один ко многим»
  • Python: количество строк, на которые влияет cursor.execute ("SELECT ...)
  • cursor.execute ("INSERT INTO im_entry.test (" + entrym + ") VALUES ('" + p + "');")
  • Как проверить типы данных столбцов в ORM SQLAlchemy?
  • как использовать много-ко-многим в sqlalchemy
  • Есть ли способ получить список имен столбцов в sqlite?
  • Параметрированные запросы с помощью psycopg2 / Python DB-API и PostgreSQL
  • несколько баз данных и несколько моделей в django
  • SQLAlchemy - выполнение массового upsert (если существует, обновление, else insert) в postgresql
  • Ошибка SQLAlchemy: «Форматы аргументов нельзя смешивать» при вводе переменных
  • Python / postgres / psycopg2: получение идентификатора только что вставленной строки
  • 3 Solutions collect form web for “Как выполнять транзакции базы данных с помощью psycopg2 / python db api?”

    Используйте db.set_isolation_level(n) , предполагая, что db является вашим объектом соединения. Как писал здесь Федерико, значение n :

     0 -> autocommit 1 -> read committed 2 -> serialized (but not officially supported by pg) 3 -> serialized 

    Как psycopg2.extensions здесь , psycopg2.extensions дает вам символические константы для этой цели:

     Setting transaction isolation levels ==================================== psycopg2 connection objects hold informations about the PostgreSQL `transaction isolation level`_. The current transaction level can be read from the `.isolation_level` attribute. The default isolation level is ``READ COMMITTED``. A different isolation level con be set through the `.set_isolation_level()` method. The level can be set to one of the following constants, defined in `psycopg2.extensions`: `ISOLATION_LEVEL_AUTOCOMMIT` No transaction is started when command are issued and no `.commit()`/`.rollback()` is required. Some PostgreSQL command such as ``CREATE DATABASE`` can't run into a transaction: to run such command use `.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)`. `ISOLATION_LEVEL_READ_COMMITTED` This is the default value. A new transaction is started at the first `.execute()` command on a cursor and at each new `.execute()` after a `.commit()` or a `.rollback()`. The transaction runs in the PostgreSQL ``READ COMMITTED`` isolation level. `ISOLATION_LEVEL_SERIALIZABLE` Transactions are run at a ``SERIALIZABLE`` isolation level. .. _transaction isolation level: http://www.postgresql.org/docs/8.1/static/transaction-iso.html 

    BEGIN с стандартным API-интерфейсом python всегда подразумевается. Когда вы начинаете работать с базой данных, драйвер выдает BEGIN и после любого COMMIT или ROLLBACK выдается другое BEGIN . API-интерфейс python DB, соответствующий спецификации, должен всегда работать таким образом (не только postgresql).

    Вы можете изменить этот параметр на уровень изоляции для db.set_isolation_level(n) с помощью db.set_isolation_level(n) как указал Алекс Мартелли.

    Как сказал Тебас, начало является неявным, но не выполняется до тех пор, пока SQL не будет выполнен, поэтому, если вы не выполняете SQL, сеанс не выполняется.

    Я предпочитаю явно видеть, где мои транзакции:

    • cursor.execute ( "BEGIN")
    • cursor.execute ( "COMMIT")
    Python - лучший язык программирования в мире.