2015-09-07 5 views
0

Согласно psycopg2 documentation, мы должны установить autocommit, чтобы получить поведение PostgreSQL по умолчанию. Это даже кажется предпочтительным подходом в соответствии с some people. Мой вопрос: если это лучший подход в этих обстоятельствах, как я могу начать транзакцию явно? Использование cursor.execute("BEGIN")?Каков предпочтительный способ обработки транзакций в pyscopg2?

С другой стороны, как справляются с этим специалисты по контексту, предоставленные psycopg2? Они автоматически запускают транзакцию в начале блока и фиксируют успех?

ответ

0

psycopg2 модель транзакции немного похожа на модель JDBC.

Чтобы открыть транзакцию, отключите автокоммутацию и просто начните работу. Нет явного ответа BEGIN.

Чтобы совершить, используйте conn.commit().

Autocommit отлично, если каждое утверждение является отдельной транзакцией естественным образом. Тогда нет необходимости в явном управлении транзакциями.

0

Лично я никогда не использую autocommit и почти всегда использую синтаксис with.

with psycopg2.connect(DSN) as conn: 
    with conn.cursor() as curs: 
     curs.execute(SQL) 

Которая будет зафиксирована, как только вы выйдете из контекстного менеджера.

Аналогично,

with psycopg2.connect(DSN) as conn: 
    with conn.cursor() as curs: 
     curs.execute(SQL) 
     raise Exception("I changed my mind") 

заставит SQL заявление безопасно откатить.

with очень полезен в Python для тех случаев, когда вы действительно нуждаетесь в жестком контроле жизни объекта, например, когда создание и разрушение объекта привязаны к транзакционному поведению.