kurtarmaya çalışırken sonra modelin benzersiz alanını yeniden kaydetmek, aşağıdaki modeli vardır:SQLAlchemy: Benim SQLAlchemy uygulamasında olmayan benzersiz bir değer
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()
Daha sonra kodda ben rastgele label
oluşturmak istediğiniz her yeni MyModel
nesneler için ve oluşturulan değer zaten DB'de mevcutsa, yalnızca yeniden oluşturun. İlk label
benzersiz değil oluşturulur ve save()
ikinci (veya üstü) yineleme üzerinde çağrıldığında durumunda bu hatayı
# 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
ama olsun:
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...
aşağıdaki yapmaya çalışıyorum Ben pozisyon (*) içinde DBSession.rollback()
eklediğinizde bu alın:
ResourceClosedError: The transaction is closed
ne yapmalıyım Bu durumu doğru şekilde ele almak için?
Teşekkür
"declarative_base()" işlevinin dönüş değerini bir değişkene atamalısınız. Aksi takdirde, onlar için farklı temel sınıflara sahip olabileceğinizden birden fazla model oluştururken sorun yaşayacaksınız. – ThiefMaster