主要问题是我尝试使用append函数,并在调用session.commit()时遇到SQL完整性错误,即使没有重新创建对象也是如此。这是我的情况:
我在Flask SQLAlchemy数据库中有一对多的关系。 它是标签类别关系,标签只属于一个类别,根据定义,类别有许多标签。为了便于说明,标签正在X对象上使用。
在我的Flask模型文件中,我这样做了:
class Category(db.Model):
__tablename__ = 'category'
id = db.Column(db.Integer, primary_key = True)
category = db.Column(db.Text, unique = True)
tags = db.relationship('Tag', backref = 'category', lazy = 'dynamic')
class Tag(db.Model):
__tablename__ = 'tags'
id = db.Column(db.Integer, primary_key = True)
tag = db.Column(db.Text, unique = True)
category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
这应该定义一个Category类,我可以使用session.append(Tag)函数“追加”标签。
类别和标签是唯一的,我想从用户那里获取输入,并按用户指定添加类别/标签。在某些情况下,用户可能只想将标记添加到现有类别中。
我接受输入的方式是使用一个表单,我从中接收类别和标记,然后创建对象并将它们添加到数据库(如果它们不存在),如果它们存在,我只想将标签附加到X或类别。
这是我的代码:
category = Category(category = request.form['categories']) #Category related to its respective list of tags
tag_list = request.form.getlist('tags') # tags are received as a list
for tag_entity in tag_list:
tag = Tag(tag = tag_entity)
X.tags.append(tag)
# Checking if the category exists or not in the database
list1 = []
if len(db.session.query(Category.tags).filter(Category.category == request.form['categories']).all()) != 0:
list1 = db.session.query(Category.tags).filter(Category.category == request.form['categories']).all()
list1.append(tag)
for entry in list1:
print entry.tag
list1 = [entry.tag for entry in list1]
# Here I should check if the tag already exists as well:
db.session.add(tag)
# Only add category if it doesn't already exist
if len(db.session.query(Category.id).filter(Category.category == request.form['categories']).all()) == 0:
print "I'm here"
db.session.add(Category(category = request.form['categories'], tags = list1))
else:
print "woops im here"
newCat = Category(category=request.form['categories'])
newCat.tags.extend(list1)
db.session.merge(newCat)
db.session.add(X)
db.session.commit()
我知道我的代码非常混乱,看起来它没有做到它应该做的事情,这是我一次又一次失败的结果。
我的主要问题是我尝试调用category.tags.append(Tag),然后在调用session.commit()时遇到完整性错误,即使甚至没有重新创建类别。
我希望我写的内容有道理,任何帮助都会受到赞赏。