2013-07-14 51 views
1

這是我第一次玩弄SQLAlchemy,我試圖插入一個項目到一個表中,並讓燒瓶打印出該項目。不過,我不斷收到這樣的一個完整性錯誤時,我不明白的例外:完整性錯誤 - Flask&SQLAlchemy

sqlalchemy.exc.IntegrityError: (IntegrityError) column email is not unique u'INSERT INTO user (username, email) VALUES (?, ?)' ('test', '[email protected]') 

我有以下代碼:

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", "[email protected]") 
     db.session.add(x) 
     db.session.commit() 
     print "worked" 
    except IntegrityError: 
     print "Not Working" 

    app.run(debug=True) 

會有人心中伸出援助的手?我對IntegrityError做了一些研究,但大多數文檔都是在處理錯誤而不是阻止它。

+0

看看錯誤信息。這封電子郵件是否已經在數據庫中? – dAnjou

+0

順便說一句。如果他們解決了您的問題,請接受答案。 – dAnjou

回答

4

好吧,這樣做的原因是有點棘手:)

錯誤消息確實意味着這個電子郵件地址已在數據庫中。但爲什麼這是?因爲debug標誌告訴內置服務器也使用reloader。而這個reloader基本上使應用程序在第一次啓動時運行兩次。你可以看到在輸出中:

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

有多種方法可以解決這個問題。 Quick'n'dirty是隻禁用reloader:

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

一個更好的辦法是不填充測試數據庫的方式。相反,我建議使用Flask-Script