SQLAlchemy中的验证

时间:2012-06-21 00:18:47

标签: python sqlalchemy

我正在使用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,这一切都是一次交易的一部分吗?

由于

1 个答案:

答案 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