Почему необходимость совершать явно при выполнении обновления?

StackOverflow https://stackoverflow.com/questions/2847999

  •  27-09-2019
  •  | 
  •  

Вопрос

Вот мой код:

import cx_Oracle

conn = cx_Oracle.connect(usr, pwd, url)
cursor = conn.cursor()
cursor.execute("UPDATE SO SET STATUS='PE' WHERE ID='100'")
conn.commit()

Если я удалю conn.commit(), Таблица не обновляется. Но для выбора утверждений мне не нужно conn.commit(). Отказ Мне любопытно, почему?

Это было полезно?

Решение

То DB-API. Спецификация требует подключения к базе данных начинается новая транзакция по умолчанию. Вы должны commit подтвердить любые изменения, которые вы делаете, или rollback отказаться от них.

Обратите внимание, что если база данных поддерживает функцию Auto-Commit, это должно быть изначально выключено.

Чистый SELECT заявления, поскольку они никогда не вступают в базу данных, не должны иметь свои изменения.

Другие советы

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

Выберите не изменяет никаких данных, так что нечего сохранить и, следовательно, нечего совершать

Видеть Википедия для транзакций

Другие объяснили, почему фиксатор не нужен на выборе выбора. Я просто хотел указать, вы могли бы использовать autocommit свойство Связь Объект, чтобы избежать необходимости вручную выполнить совершить себя:

import cx_Oracle

with cx_Oracle.connect(usr, pwd, url) as conn:
    conn.autocommit = True
    cursor = conn.cursor()
    cursor.execute("UPDATE SO SET STATUS='PE' WHERE ID='100'")
    cursor.close()

Это особенно полезно, когда у вас есть несколько операторов вставки, обновления и удаления в одном соединении.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top