我有一个大型数据库的元素,每个元素都有唯一键。每隔一段时间(每分钟一次),我都会加载更多需要添加到数据库的项目,但如果它们与数据库中已存在的项目重复,则会被丢弃。添加元素到Django数据库
我的问题是 - 是不是更好?:
- 获取的Django给我一个清单(或设置)中的所有独特的键,然后的,尝试添加每个新项目之前,检查它的密钥是否在列表中,或者
- 围绕新项目的保存调用有一个try/except语句,并且在Django上捕获重复项的回复?
干杯, 杰克
我有一个大型数据库的元素,每个元素都有唯一键。每隔一段时间(每分钟一次),我都会加载更多需要添加到数据库的项目,但如果它们与数据库中已存在的项目重复,则会被丢弃。添加元素到Django数据库
我的问题是 - 是不是更好?:
干杯, 杰克
如果你使用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”方法略好,但它仍然需要不断切换到应用服务器来处理每个冲突,尽管速度更快。最好让数据库完成这项工作。
很好的答案,谢谢 – JMzance