【问题标题】:Integrity Error - Flask & SQLAlchemy完整性错误 - Flask 和 SQLAlchemy
【发布时间】:2013-07-12 14:47:54
【问题描述】:

这是我第一次使用 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 进行了一些研究,但大部分文档都是关于处理错误而不是防止它。

【问题讨论】:

    标签: sql sqlalchemy flask flask-sqlalchemy


    【解决方案1】:

    好吧,这个原因有点棘手:)

    错误消息确实意味着该电子邮件地址已经在数据库中。但这是为什么?因为debug 标志告诉内置服务器也使用重新加载器。而这个重新加载器基本上使应用程序在第一次启动时运行两次。您可以在输出中看到:

    $ 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)
    

    更好的方法是不以这种方式填充测试数据库。相反,您可以使用Flask's CLI 创建一个单独的自定义命令。

    【讨论】:

    • Flask-Script 警告:虽然维护者愿意合并 PR,但他们并没有积极开发功能。从 Flask 0.11 开始,Flask 包含一个内置的 CLI 工具,它可能会更好地满足您的需求。
    • @rla 感谢您指出这一点。随意编辑我的答案或让我知道,我也可以这样做。
    猜你喜欢
    • 2018-06-08
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 2015-06-09
    • 2012-07-04
    • 2016-09-26
    • 2016-02-03
    相关资源
    最近更新 更多