python - Flask关系模型如果不存在则多次获取或创建

标签 python many-to-many sqlalchemy bulkinsert flask

我刚刚开始使用 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/

相关文章:

python - 生产中的 Django 的 POST 请求在计算引擎上抛出服务器错误(500)

php - 有没有更智能的方法来使用 PHP 和 MySQL 加载多对多关系?

python - SQLalchemy 数据库列应该是什么模型来包含数据数组?

python - Cartopy map 可视化错误: unknown projection

python - Google API 和 cx_Freeze 无法正常工作

python - 如何从文件夹加载变压器管道?

python - Django 在包含日期列表的多对多字段中过滤日期名称

python - 使用 SQLAlchemy 查询 SQL Server JSON 列

python - sqlalchemy - 多个文件 - 关系