Почему необходимость совершать явно при выполнении обновления?
Вопрос
Вот мой код:
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()
Это особенно полезно, когда у вас есть несколько операторов вставки, обновления и удаления в одном соединении.