Flask关系模型多次获取或创建(如果不存在)

时间:2012-02-25 20:15:29

标签: python many-to-many sqlalchemy bulkinsert flask

我刚开始使用Flask和SQLAlchemy。

所以我使用这里的示例http://docs.sqlalchemy.org/en/latest/orm/tutorial.html建立了多对多的关系 如果您向下滚动到关于关键字和标签的部分,这就是我正在处理的内容。 到目前为止,我能够插入与我的帖子相关的新关键字,我正在使用追加。我知道哪个错了。那么下一次在博客文章中出现非唯一关键字时会发生关于与关键字冲突的错误(因为关键字应该是唯一的)

我知道正确的方式是别的,我只是不知道是什么。我见过一个例子 get_or_create(keyword)基本上按关键字过滤,然后在找不到时添加。但是我相信随着数据量的增长,这也是错误的。 (多次调用每次保存单个插入)。我喜欢SQLAlchemy自动进行多次插入的方式。我希望保留这一点,但要避免这个重复的关键问题。

编辑:找到解决方案,SQLAlchemy文档引导您走向错误,但解释就在那里。我已经添加了答案。

1 个答案:

答案 0 :(得分:2)

在经过数小时的试验和错误后,我找到了解决方案,加上我做错了一些事。

这就是SQL炼金术的工作原理。答案是合并。

将标记列表作为标记模型,不管它们是否存在,只要您的主键是名称或独特的东西。

tags = [Tag('a1'),Tag('a2')]

假设您已经在数据库中使用了标签a1,但我们并不在意。我们想要的只是在相关数据不存在时插入。这是SQLalchemy所做的。 现在,您使用我们制作的所有标签的LIST制作帖子。如果它只是一个,它也是一个列表。

因此

new_post = Post('a great new post',post_tags=tags)
db.session.merge(new_post)
db.session.commit()

我使用过Flask语法,但想法是一样的。只需确保您没有在会话中创建Model OUTSIDE。更有可能的是,你不会这样做。

这实际上很简单,但在SQLAlchemy文档中没有提到这个例子。他们使用append()这是错误的。只有创建新的标签,知道你没有重复。

希望它有所帮助。