7

SQLAlchemy をいじるのはこれが初めてで、アイテムをテーブルに挿入して、フラスコにそのアイテムを出力させようとしています。ただし、例外をキャッチしないと、次のような整合性エラーが発生し続けます。

sqlalchemy.exc.IntegrityError: (IntegrityError) column email is not unique u'INSERT INTO user (username, email) VALUES (?, ?)' ('test', 'test@gmail.com')

次のコードがあります。

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy.exc import IntegrityError

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///test.db"

db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return "<User %r>" % self.username

@app.route("/")
def index():
    return User.query.all() # I don't think this will work

if __name__ == "__main__":
    db.create_all()
    try:
        x = User("test", "test@gmail.com")
        db.session.add(x)
        db.session.commit()
        print "worked"
    except IntegrityError:
        print "Not Working"

    app.run(debug=True)

誰か手を差し伸べてくれな​​い?IntegrityError についていくつか調査しましたが、ドキュメントのほとんどはエラーの処理に関するものであり、エラーを防止するものではありません。

4

1 に答える 1

8

さて、この理由は少しトリッキーです:)

エラー メッセージは、この電子メール アドレスが既に DB にあることを意味します。しかし、これは一体なぜなのでしょうか。debugフラグは組み込みサーバーにリローダーも使用するように指示するためです。そして、このリローダーは基本的に、最初の起動時にアプリを 2 回実行します。出力で次のことがわかります。

$ python2 server.py
worked
 * Running on http://127.0.0.1:5000/
 * Restarting with reloader
Not Working

それを回避する方法は複数あります。Quick'n'dirty は、リローダーを無効にするだけです。

app.run(debug=True, use_reloader=False)

より良い方法は、テスト DB をそのように設定しないことです。代わりに、 Flask の CLIを使用して別のカスタム コマンドを作成できます。

于 2013-07-14T20:49:11.017 に答える