2015-06-25 213 views
1

我正在使用Flask和SQLAlchemy和SQLite來創建一個應用程序,以跟蹤您廚房中的物品以及您喜歡製作的食譜。SQLAlchemy:UNIQUE約束失敗錯誤,但沒有設置唯一約束

我很難過這個。我有一張表格,應該可以讓記錄具有重複的字段。每次我嘗試在我的應用程序中爲此表創建數據庫條目時,都會引發「IntegrityError:UNIQUE約束失敗」。這是莫名其妙的,因爲它在上提出的列不是有明確設置的唯一約束。

下面是我插入到表中的模型:

class PantryItem(db.Model): 

    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(64)) 
    amount = db.Column(db.String(12)) 
    user_id = db.Column(db.Integer, db.ForeignKey('user.id')) 

    def __repr__(self): 
     return '<PantryItem %r> % self.name' 

這裏是應該被添加到DATABSE條目的視圖代碼:

@app.route('/pantry', methods=['GET', 'POST']) 
@login_required 
def pantry(): 

    form = IngredientForm() 
    pantry = PantryItem.query.filter_by(owner=g.user).all() 

    if form.validate_on_submit(): 

     pantry_item = PantryItem(name=form.name.data, amount=form.amount.data, owner=g.user) 
     db.session.add(pantry_item) 
     db.session.commit() 

     flash('You added %s to the pantry.' % pantry_item.name) 
     return redirect(url_for('pantry')) 

    return render_template('pantry.html', 
       form=form, 
       user=g.user, 
       pantry=pantry) 

這裏是錯誤我正在提交表單:

IntegrityError: (IntegrityError) UNIQUE constraint failed: pantry_item.name u'INSERT INTO pantry_item (name, amount, user_id) VALUES (?, ?, ?)' (u'Milk', u'2 cups', 1) 

表中已經有一個PantryItem的記錄名字叫「牛奶」。

我不正確的假設PantryItem的主鍵「ID」會區分記錄與另一個記錄具有相同的名稱/金額/所有者?還是我完全忽略了一些東西?

非常感謝您的幫助。

+2

完整性錯誤來自數據庫。數據庫中的表是否有唯一的名稱限制? –

+0

是的,它似乎在數據庫中的表確實有一個唯一的約束集。我在某一時刻在我的Python類模型中設置了一個唯一的約束,但是後來改變了它。我認爲我的數據庫遷移腳本會更新我的模式,但它顯然沒有。我的問題是通過刪除所有舊數據庫記錄並輸入新記錄來解決的。 –

回答

4

刪除您的表格或刪除您的數據庫並重新初始化它。每次進行模式更改時,都必須刪除表並重新初始化,而不僅僅是更新。