Задать вопрос
  • В чем отличие asyncpg.Connection.transaction и asyncpg.Connection.acquire?

    @slep0v
    Это ортагональные вещи:

    acquire() позволяет достать соединение из пула.

    transaction() используется для обертки и выполнения нескольких запросов как единое целое (обратите внимание на использование внутри context-manager).

    Если возникает ошибка посередине транзакции, то к предыдущим командам применяется rollback и никаких изменений не происходит по итогу.

    Если нужно выполнять команды по одной, достаточно использовать connection из `pool.acquire`.

    При этом `transaction` можно вызывать из `connection`:

    async with pool.acquire() as connection:
        async with connection.transaction():
            # Write operation
            await connection.execute('INSERT INTO mytable (col1) VALUES ($1)', 123)
            # Read operation
            result = await connection.fetch('SELECT * FROM mytable WHERE col1 = $1', 123)
    Ответ написан
    Комментировать