postgresql django 中的近似行数

approximate count of rows in postgresql django

我有一个与 django 连接的 postgresql 数据库。在数据库中有很多大表,我想要它们的行数。由于表很大,这需要很多时间来执行。

我发现可以从 pg_class 中检索到大概的计数。在 Django 中有什么办法不执行原始查询吗?

我建议为这个名为 django-postgres-fuzzycount [GitHub] 使用专用包。这个包提供了一个管理器来进行快速计数。

您可以使用 pip 安装软件包(例如在您的本地环境中):

$ pip install django-postgres-fuzzycount

然后您可以将FuzzyCountManager添加到您想要获得近似计数的模型中:

from django.db import models
from fuzzycount import <b>FuzzyCountManager</b>

class SomeModel(models.Model):

    #  ... (some fields) ...

    objects = models.Manager()
    <b>approx</b> = FuzzyCountManager()

然后你可以近似地计算:

SomeModel.approx.count()

如果你 .filter(..),Django 将计算 真实的 数字,因为 pg_class table 仅存储近似的行数对于 整个 table,所以:

SomeModel.approx.filter(foo=bar).count()

将花费更多时间(取决于索引等)。

您也可以直接“修补”objects 管理器,但是获取真实 条记录可能会比较困难:

from django.db import models
from fuzzycount import FuzzyCountManager

class SomeModel(models.Model):

    #  ... (some fields) ...

    <b>objects</b> = FuzzyCountManager()

如果您将后端数据库更改为另一个数据库,FuzzyCountManager(..) 将充当 普通 Manager,这也很好,因此以防万一你以后改了数据库系统,就不用重写managers了。