我有一个简单的多对多关系,如下所示:
tags = db.Table('tags',
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
db.Column('page_id', db.Integer, db.ForeignKey('page.id'))
)
class Page(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(128))
tags = db.relationship('Tag', secondary=tags,
backref=db.backref('pages', lazy='dynamic'))
class Tag(db.Model):
name = db.Column(db.String(128))
id = db.Column(db.Integer, primary_key=True)
我有一些yaml格式的数据:
Page 1:
- tag1
- tag2
Page 2:
- tag3
- tag4
加载时看起来像这样:
data = {'Page 1': ['tag1', 'tag2'], 'Page 2': ['tag3', 'tag4']}
当我尝试将其插入数据库时:
def load_data():
for page_title in data:
p = (Page.query.filter_by(title=page_title).first() or
Page(
title=page_title
)
)
for tag_name in data[page_title]:
t = (Tag.query.filter_by(name=tag_name).first() or
Tag(
name=tag_name
)
)
p.tags.append(t)
db.session.add(p)
db.session.commit()
然后再把它丢弃:
def dump_data():
pages = Page.query.all()
for p in pages:
print p.title + ":"
for t in p.tags:
print " - " + t.name
标签与多个页面相关联:
Page 1:
- tag1
- tag3
- tag4
- tag2
Page 2:
- tag2
- tag3
- tag4
我不知道为什么。 (这不是转储方法,因为我已经通过flask-admin确认了数据库中存在关系。)感谢任何帮助!
(我应该补充一点,我是Python,Flask和Flask-SQLAalchemy的新手,所以我在进行这项工作的时候就这么做了!但是我已经读过这个并尝试了多种替代方案,但无济于事。)
答案 0 :(得分:0)
事实证明这是非常简单的,需要花费很长时间才能发现 - 我曾在某些时候删除了Page和Tag数据,但没有删除它们的关联,因此新数据获得了旧的和新的关联!