khufu следует практике пирамиды использования менеджера транзакций для обработки ваших соединений с базой данных.Это означает, что есть код (ZopeTransactionExtension
в инициализации вашего создателя сеанса), который перехватывает сеанс базы данных и отслеживает изменения.При обнаружении изменений они будут автоматически зафиксированы в конце запроса, если ошибок не возникнет.Если вы пропускаете ORM и вызываете функцию execute самостоятельно, вы можете либо: 1) отключить диспетчер транзакций и самостоятельно совершить вызов, либо 2) пометить сеанс как грязный после выполнения execute
, чтобы соединение могло думать, что все изменилось, и автоматически вызывать commit.для тебя.Второй способ предпочтительнее, потому что если вы вызываете коммит преждевременно самостоятельно, остальная часть кода может потерпеть неудачу, и все же данные все еще сохраняются в вашей базе данных.Чтобы сделать второй способ, используйте функцию mark_changed
из расширения.
from zope.sqlalchemy import mark_changed
session = DBSession()
mark_changed(session)
В качестве примечания: если вы хотите принудительно зафиксировать транзакцию до конца запроса, вы можете сделатьчерез
import transaction
transaction.commit()
Но, опять же, это произойдет автоматически в конце запроса, если не возникнет ошибок.