我正在使用Flask和flask-SQLAlchemy扩展来创建一个webapp,我在模型声明中添加了unique=True
之类的字段。
class Coupon(db.Model):
username = db.Column(db.String(80), primary_key=True)
value = db.Column(db.String(80), unique=True)
is_valid = db.Column(db.Boolean)
def __init__(self, value, username):
self.value = value
self.username = username
self.is_valid = True
验证失败后恢复的最佳(pythonic)方法是什么?例如 -
c1 = Coupon("same_value", "foo")
db.session.add(c1)
c2 = Coupon("same_value", "bar")
db.session.add(c2)
db.session.commit() #gives an IntegrityError
我应该使用try,除了块来处理这个吗?或者是否有更好的方法来处理没有成功的交易。关于交易的一个额外查询 - 只要继续向会话添加对象而不执行session.commit
,这一切都是一次交易的一部分吗?
由于
答案 0 :(得分:4)
我不确定try-catch
commit()
来电是否有意义。即使你这样做,你如何进一步前进?你如何进一步找到问题并修复它?你可能已经有几十个重复。
这里的座右铭是: 早期出现错误 。
因此,我可能会做的是:我会在session.flush()
之后添加对session.add(c?)
的调用。这将足够早地指出问题,以便我正确处理。因此,将add/flush
包装在try-catch
块中并在适当的时候进行处理会更有意义:
def _add_coupon(c):
""" @param c: instance of Coupon.
@return: True if success, False on failure.
"""
try:
session.add(c)
session.flush()
return True
except sqlalchemy.exc.IntegrityError as err:
# @todo: handle as appropriate: return existing instance [session.query(Coupon).filter(Coupon.value==c.value).one()] or re-raise
logger.error("Tried to add a duplicate entry for the Coupon value [%s]. Aborting", c.value)
return False