Django mysql count distinct为postgres

时间:2015-10-19 09:01:03

标签: mysql django postgresql orm

我试图计算针对mysql数据库的django查询中的一组fitered结果的不同字符串值与postgres数据库中的相同数据。但是,我的结果确实令人困惑。

在下面的代码中,NewOrder表示针对postgres数据库中相同数据的查询,而OldOrder是MYSQL实例中的相同数据。

(在旧数据库中,已完成的订单状态= 1,在新的数据库完成状态='完成'。在'电子邮件'字段中是相同的)

OldOrder.objects.filter(status=1).count()
6751

NewOrder.objects.filter(status='Complete').count()
6751

OldOrder.objects.filter(status=1).values('email').distinct().count()
3747

NewOrder.objects.filter(status='Complete').values('email').distinct().count()
3825

print NewOrder.objects.filter(status='Complete').values('email').distinct().query
SELECT DISTINCT "order_order"."email" FROM "order_order" WHERE "order_order"."status" = Complete

print OldSale.objects.filter(status=1).values('email').distinct().query
SELECT DISTINCT "order_order"."email" FROM "order_order" WHERE "order_order"."status" = 1

这就是它变得奇怪的地方

new_orders = NewOrder.objects.filter(status='Complete').values_list('email', flat=True)
len(set(new_orders))
3825

old_orders = OldOrder.objects.filter(status=1).values_list('email',flat=True)
len(set(old_orders))
3825

任何人都可以解释这种差异吗?并可能指出为什么postgres和mysql之间的结果会有所不同?我唯一的猜测是字符编码问题,但我希望python set()的结果也不同?

1 个答案:

答案 0 :(得分:1)

听起来你可能在MySQL中使用不区分大小写的排序规则。 PostgreSQL中没有等价物;最接近的是citext数据类型,但通常只需比较lower(...)个字符串,或使用ILIKE进行模式匹配。

我不知道如何在Django中说出来,但我会看到一组不同的小写电子邮件地址的数量是否与旧数据库相同。

根据the Django docs,这样的事可能有用:

NewOrder.objects.filter(status='Complete').values(Lower('email')).distinct()