【发布时间】:2011-11-24 15:06:37
【问题描述】:
在我的 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 对象随机生成 label,如果生成的值已存在于 DB 中,则重新生成它。
我正在尝试执行以下操作:
# 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
但如果第一次生成 label 不是唯一的并且在第二次(或以后)迭代中调用 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
我应该怎么做才能正确处理这种情况?
谢谢
【问题讨论】:
-
您应该将
declarative_base()的返回值分配给一个变量。否则在创建多个模型时会遇到问题,因为它们可能有不同的基类。
标签: python database sqlalchemy