我有一个与Django连接的PostgreSQL数据库。在数据库中,有很多大表我想要它们的行数。由于表的大小很大,因此需要花费很多时间来执行。
我发现可以从pg_class
中检索近似计数。有什么办法可以在Django中执行而不执行原始查询吗?
答案 0 :(得分:1)
我建议为此使用专用的软件包django-postgres-fuzzycount
[GitHub]。该软件包提供了一个可以进行快速计数的管理器。
您可以使用pip
安装软件包(例如,在您的本地环境中):
$ pip install django-postgres-fuzzycount
然后,您可以将``添加到要获取近似计数的模型中:
from django.db import models
from fuzzycount import FuzzyCountManager
class SomeModel(models.Model):
# ... (some fields) ...
objects = models.Manager()
approx = FuzzyCountManager()
然后您可以近似地算出:
SomeModel.approx.count()
如果您.filter(..)
,则Django将计算 real 数,因为pg_class
表仅存储整个 的行数>表格,因此:
SomeModel.approx.filter(foo=bar).count()
将花费更多时间(取决于索引等)。
您也可以直接“修补” objects
管理器,但是要获得 real 条记录可能会更困难:
from django.db import models
from fuzzycount import FuzzyCountManager
class SomeModel(models.Model):
# ... (some fields) ...
objects = FuzzyCountManager()
如果将后端数据库更改为另一个数据库,则FuzzyCountManager(..)
将充当 normal Manager
,这也很好,因此,以后您更改数据库时系统,您不必重写管理器。