Dans mon application SQLAlchemy je le modèle suivant:SQLAlchemy: Re sauver champ unique de modèle après avoir essayé de sauver la valeur non unique
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()
plus tard dans le code pour tous les nouveaux MyModel
objets que je veux générer label
au hasard et juste le régénérer si la valeur générée existe déjà dans DB.
Je suis en train de faire ce qui suit:
# 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
mais obtenir cette erreur dans le cas lors de la première généré label
n'est pas unique et save()
appelé au deuxième (ou version ultérieure) itération:
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...
quand j'ajoute DBSession.rollback()
dans la position (*) Je reçois ceci:
ResourceClosedError: The transaction is closed
Que dois-je faire gérer cette situation correctement?
Merci
Vous devez affecter la valeur de retour de 'declarative_base()' à une variable. Sinon, vous rencontrerez des problèmes lors de la création de plusieurs modèles car vous pourriez avoir différentes classes de base pour eux. – ThiefMaster