2015-04-23 5 views
4

Как вы реализуете @commit_manually в Django 1.8?Ручная фиксация в Django 1.8

Я пытаюсь обновить код Django 1.5 для работы с Django 1.8, и по какой-то причудливой причине в Django 1.6 был удален декоратор commit_manually без прямой замены. Мой процесс выполняет итерацию по тысячам записей, поэтому он не может полностью обернуть весь процесс в одной транзакции без нехватки памяти, но для повышения производительности по-прежнему необходимо сгруппировать некоторые записи в транзакции. Для этого у меня был метод, завернутый с @commit_manually, который назывался transaction.commit() каждые N итераций.

Я не могу точно сказать из docs, но это все еще поддерживается. Мне просто нужно позвонить set_autocommit(False) вместо того, чтобы иметь удобный декоратор. Это верно?

ответ

7

Да, у вас это есть. Позвоните по телефону set_autocommit(False), чтобы начать транзакцию, затем позвоните commit() и set_autocommit(True), чтобы совершить сделку.

Вы можете обернуть это в собственном декоратора:

def commit_manually(fn): 
    def _commit_manually(*args, **kwargs): 
     set_autocommit(False) 
     res = fn(*args, **kwargs) 
     commit() 
     set_autocommit(True) 
     return res 
    return _commit_manually 
+1

спасибо, работает как шарм! Но я предпочитаю использовать rollback вместо commit после вызова функции, а также вызывать функцию внутри try, кроме блока. – VahidM

Смежные вопросы