2016-02-29 93 views
3

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

我的问题是 - 是不是更好?:

  1. 获取的Django给我一个清单(或设置)中的所有独特的键,然后的,尝试添加每个新项目之前,检查它的密钥是否在列表中,或者
  2. 围绕新项目的保存调用有一个try/except语句,并且在Django上捕获重复项的回复?

干杯, 杰克

回答

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; 

不管你做什么,避免“选择所有行和首先检查办法”为最坏情况下的性能是O(n)在Python,基本上短期因为检查是在应用程序机器上执行的(并且最终还会受到内存限制),所以可以利用数据库提供的任何性能优势。

try/except方法比“select all rows”方法略好,但它仍然需要不断切换到应用服务器来处理每个冲突,尽管速度更快。最好让数据库完成这项工作。

+0

很好的答案,谢谢 – JMzance