2015-06-25 173 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

删除您的表格或删除您的数据库并重新初始化它。每次进行模式更改时,都必须删除表并重新初始化,而不仅仅是更新。