1

我正在使用 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

我应该尝试一下,除了块来处理这个吗?或者有没有更好的方法来处理没有成功的交易。关于事务的一个附加查询 - 只要继续将对象添加到会话而不执行,session.commit这是否都是一个事务的一部分?

谢谢

4

1 回答 1

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
于 2012-06-21T08:08:24.827 回答