向Django数据库添加元素

时间:2016-02-29 23:34:02

标签: python django postgresql

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

我的问题是 - 对......来说更好:

  1. 让Django给我一个所有唯一键的列表(或设置),然后在尝试添加每个新项目之前,检查它的键是否在列表中,或者
  2. 在新项目的保存调用周围有一个try / except语句,并回复Django捕获副本?
  3. 干杯, 千斤顶

1 个答案:

答案 0 :(得分:1)

如果你正在使用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方法略微优于"选择所有行"方法,但它仍然需要不断切换到应用程序服务器来处理每个冲突,尽管要快得多。最好让数据库完成工作。