@AlmazKayum

Надо ли ставить commit в конструкции with?

Python 3.7.3
PostgreSQL 10
import psycopg2

class User:

    def __init__(self, database):
        self.conn = psycopg2.connect(database)
        self.cursor = self.conn.cursor()

    def set_address(self, address, user_id):
        with self.conn:
            self.cursor.execute('UPDATE users SET address=%s WHERE user_id=%s', (user_id, address))
            self.conn.commit()

Конструкция with кажется предполагает закрытие соединения с БД, надо ли ставить self.conn.commit() ?
  • Вопрос задан
  • 236 просмотров
Пригласить эксперта
Ответы на вопрос 1
@galaxy
Конструкция with кажется предполагает закрытие соединения с БД

не предполагает:
Cursors can be used as context managers: leaving the context will close the cursor.


Cоединение закрывает только метод close() объекта connection (или del на connection).

Делать commit() в вашем случае необходимо, т.к. по умолчанию psycopg открывает транзакцию перед выполнением первого запроса. Другой вариант - работать в режиме autocommit.

Вообще, на будущее, - конструкции с with делают в разных драйверах СУБД разные вещи и не регламентируются DB-API. Так что надо либо внимательно курить документацию, либо их не использовать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы