SQLAlchemy: Повторное сохранение уникального поля модели после попытки сохранить неуникальное значение

В моем приложении SQLAlchemy у меня есть следующая модель:

from sqlalchemy import Column, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import scoped_session, sessionmaker
from zope.sqlalchemy import ZopeTransactionExtension

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

class MyModel(declarative_base()):
    # ...
    label = Column(String(20), unique=True)

    def save(self, force=False):
        DBSession.add(self)
        if force:
            DBSession.flush()

Позже в коде для каждого нового MyModel объектов, я хочу сгенерировать метку случайным образом и просто восстановить ее, если сгенерированное значение уже существует в БД.
Я пытаюсь сделать следующее:

# my_model is an object of MyModel
while True:
    my_model.label = generate_label()
    try:
        my_model.save(force=True)
    except IntegrityError:
        # label is not unique - will do one more iteration
        # (*)
        pass
    else:
        # my_model saved successfully - exit the loop
        break

, но получаю эту ошибку, если первая сгенерированная метка не уникальна и вызывается save () на второй (или более поздней) итерации:

 InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (IntegrityError) column url_label is not unique... 

Когда я добавляю DBSession.rollback () в позицию (*), я получаю следующее:

 ResourceClosedError: The transaction is closed

Что мне делать, чтобы правильно обработать эту ситуацию?
Спасибо

7
задан PaulMcG 25 September 2011 в 15:06
поделиться