【发布时间】:2018-04-12 07:54:53
【问题描述】:
我需要比较来自 2 个不同数据库的同一模型的 2 个查询集。
我期待它们之间的区别。在这种情况下,我只从两个数据库中抓取一列(charfield)并想要比较这个“列表”,即使用集合和集合的差异方法会很棒。
但我不能简单地减去查询集,也不能简单地减去 set(queryset) 和 list(querysets)——这给了我任何东西(不是错误),即
diff_set = set(articles1) - set(articles2)
我即时切换了 db,创建了 2 个查询集并尝试比较它们(过滤或排除)
articles1 = list(Smdocuments.objects.using('tmp1').only('id').filter(doctype__exact='CQ'))
# right connection
connections.databases['tmp2']['HOST'] = db2.host
connections.databases['tmp2']['NAME'] = db2.name
articles2 = list(Smdocuments.objects.using('tmp2').only('id').filter(doctype__exact='CQ'))
# okay to chain Smdocuments objects, gives all the entries
all = list(chain(articles1, articles2))
# got nothing, even len(diff_set) is none
diff_set = set(articles1) - set(articles2)
# this one raise error Subqueries aren't allowed across different databases.
articles_exclude = Smdocuments.objects.using('tmp1').only('id').filter(doctype__exact='CQ')
len(articles1)
diff_ex = Smdocuments.objects.using('tmp2').only('id').filter(doctype__exact='CQ').exclude(id__in=articles_exclude)
len(diff_ex)
diff_ex 引发错误
子查询不允许跨不同的数据库。强迫内心 要使用
list(inner_query)评估的查询。
因此,“模型对象”不是那么容易操作,不同数据库之间的查询集也是如此。
我明白了,这不是一个好的数据库方案,但它是另一个具有分布式数据库的应用程序,我需要比较它们。
按一列比较就足够了,但是比较完整的查询集可能会在将来起作用。 或者,我应该将查询集转换为列表并比较原始数据吗?
【问题讨论】:
-
请发布您的代码的实际输出(没有人会为了测试它而设置一个完整的 django 项目)和预期的输出。
-
更新了帖子,set(articles1) - set(articles2) 什么也没得到,但没有错误 Queryset method difference() 也不适用于不同的数据库
-
这仍然不能解释你的期望......
标签: python django django-queryset