1

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, except ブロックを使用する必要がありますか? または、成功していないトランザクションに対処するためのより良い方法はありますか? トランザクションに関する 1 つの追加クエリ - オブジェクトをセッションに追加し続け、実行しない限り、session.commitそれはすべて 1 つのトランザクションの一部ですか?

ありがとう

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 に答える