我有一个大型元素数据库,每个元素都有唯一的键。每隔一段时间(每分钟一次)我会加载更多需要添加到数据库中的项目,但如果它们与数据库中已有的内容重复,它们将被丢弃。
我的问题是 - 是否更好...:
- 让 Django 给我一个包含所有唯一键的列表(或集合),然后在尝试添加每个新项目之前,检查它的键是否在列表中,或者,
- 在新项目的保存调用周围有一个 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/