我刚刚开始使用 Flask 和 Flask 中的 SQLAlchemy。
因此,我使用此处的示例建立了多对多关系 http://docs.sqlalchemy.org/en/latest/orm/tutorial.html 如果您向下滚动到有关关键字和标签的部分,这就是我正在研究的内容。 到目前为止,我可以插入与我的帖子相关的新关键字,并且我正在使用附加。我知道这是错误的。因此,下次博客文章中出现非唯一关键字时,它将抛出有关关键字冲突的错误(因为关键字应该是唯一的)
我知道正确的方法是别的,我只是不知道是什么。我见过一个例子 get_or_create(keyword) 基本上按关键字过滤,如果找不到则添加它。然而,我相信随着数据大小的增长,这也将是错误的。 (每次保存时都会调用一次插入)。我喜欢 SQLAlchemy 自动执行多次插入的方式。我希望保留它,但避免出现重复的 key 问题。
编辑:找到解决方案,SQLAlchemy 文档引导您出错,但解释就在那里。我已经添加了答案。
最佳答案
好吧,经过几个小时的反复试验,我找到了解决方案,再加上我做错了一些事情。
这就是 SQL 炼金术的工作原理。答案是合并。
制作一个标签列表作为标签模型,只要你的主键是名称或唯一的东西,它们是否存在并不重要。
tags = [Tag('a1'),Tag('a2')]
假设您的数据库中已有标签 a1,但我们并不关心。我们想要的只是在相关数据不存在时插入。这就是 SQLalchemy 所做的事情。 现在您可以使用我们制作的所有标签的列表来发布帖子。如果它只是一个,那么它也是一个列表。
因此
new_post = Post('a great new post',post_tags=tags)
db.session.merge(new_post)
db.session.commit()
我使用了 Flask 语法,但想法是一样的。只需确保您没有在 session 之外创建模型即可。更有可能的是,您不会这样做。
这实际上很简单,但 SQLAlchemy 文档中没有提到此示例。他们使用append(),这是错误的。这只是为了创建新标签,并且知道您不会重复。
希望有帮助。
关于python - Flask关系模型如果不存在则多次获取或创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9447670/