14

私は非常に単純なSqlAlchemyモデルを持っています

class User(Base):
    """ The SQLAlchemy declarative model class for a User object. """
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    phone = Column(String, unique=True)
    email = Column(String, unique=True)

新しいユーザーを挿入するときにIntegrityError、電子メールまたは電話が重複している場合に発生する可能性があります。

どの列が整合性エラーに違反していたかを検出する方法はありますか?または、値が存在するかどうかを確認するために別のクエリを実行する唯一の方法ですか?

4

4 に答える 4

5

残念ながら、これを行う明確な方法はありませんが、IntegrityError とparseモジュールで orig 属性を使用します。

try:
    db.session.add(user)
    db.session.commit()
except IntegrityError, e:
    dupe_field = parse('duplicate key value violates unique constraint "{constraint}"\nDETAIL:  Key ({field})=({input}) already exists.\n', str(e.orig))["field"]

これは IntegrityError がスローする唯一のエラー文字列ではない可能性があり、SQLAlchemy の将来の更新で変更される可能性があるため、理想的ではありません

于 2016-11-15T15:42:38.683 に答える
-4

通常、これには try catch を使用します。

try:
    session.commit()
catch:   
str(sys.exc_info()[0]) + " \nDESCRIPTION:  "+ str(sys.exc_info()[1]) + "\n" + str(sys.exc_info()[2])

整合性エラーが発生すると、次のメッセージが表示され、その特定のトランザクションをスキップして残りのトランザクションを続行します

DESCRIPTION:  (IntegrityError) duplicate key value violates unique constraint "test_code"
DETAIL:  Key (test_code)=(5342) already exists.
'INSERT INTO test_table (pk, test_code, test_name) VALUES (%(pk)s, %(test_code)s, %(test_name)s)' { 'pk': '1', 'test_code': '5342', 'test_name': 'test' }
于 2012-08-02T10:26:01.420 に答える