python - 向 Django 数据库添加元素

标签 python django postgresql

我有一个大型元素数据库,每个元素都有唯一的键。每隔一段时间(每分钟一次)我会加载更多需要添加到数据库中的项目,但如果它们与数据库中已有的内容重复,它们将被丢弃。

我的问题是 - 是否更好...:

  1. 让 Django 给我一个包含所有唯一键的列表(或集合),然后在尝试添加每个新项目之前,检查它的键是否在列表中,或者,
  2. 在新项目的保存调用周围有一个 try/except 语句并回复 Django 捕获重复项?

干杯, jack

最佳答案

如果您使用的是 MySQL,您可以轻松使用 INSERT IGNORE,这将是最高效的解决方案。您可以直接使用游标 API 执行自定义 SQL 查询。 ( https://docs.djangoproject.com/en/1.9/topics/db/sql/#executing-custom-sql-directly )

如果您使用的是 Postgres 或其他一些支持INSERT IGNORE 的数据存储,那么事情会变得有点复杂。

对于 Postgres,您可以使用规则来制作您自己的 INSERT IGNORE 版本。

它看起来像这样:

CREATE RULE "insert_ignore" AS ON INSERT TO "some_table"
WHERE EXISTS (SELECT 1 FROM some_table WHERE pk=NEW.pk) DO INSTEAD NOTHING;

无论你做什么,都要避免“选择所有行并首先检查方法”,因为在 Python 中最坏情况下的性能是 O(n) 并且基本上会缩短数据库提供的任何性能优势,因为检查是在应用程序机器(最终也受内存限制)。

try/except 方法比“选择所有行”方法稍微好一些,但它仍然需要不断切换到应用程序服务器来处理每个冲突,尽管速度要快得多。最好让数据库完成这项工作。

关于python - 向 Django 数据库添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35711907/

相关文章:

python - GoogleAppEngineLauncher : database disk image is malformed

python - 如何使用特定的 python 版本创建 conda 环境?

python - 如何有效地比较 numpy 数组中的条目?

postgresql - 如何使用 rust-postgres 检查列是否为 NULL?

python - Django Quill Editor 显示保存的字段

django - 在 Django 中按内容对象的值排序

python - 当我将 Django Celery apply_async 与 eta 一起使用时,它会立即完成工作

启用 grappelli 后,django adminplus 链接消失

ruby-on-rails - rails_admin : undefined method `year' for nil:NilClass

PostgreSQL:使用for循环迭代表行,根据当前行检索列值