如何使用 Prisma 对 PostgreSQL 数据库进行采样?

问题描述 投票:0回答:2

假设我的 PostgreSQL 数据库中有数百万条语句,但我只想获取其中的 10000 条。但不是前 10000 个,而是随机选择 10000 个(如果我也可以选择逻辑,例如选择每 4 个语句,那就最好了)。

我如何使用 Prisma 来做到这一点,或者——如果无法使用 Prisma——使用一个好的旧 PostgreSQL 请求?

目前,我使用此代码来限制我获得的结果数量:

const statements = await this.prisma.statement.findMany({
      where: {
        OR: conditions,
      },
      orderBy: {
        createdAt: 'asc',
      },
      take: 10000,
    });

这将使用我拥有的条件,然后按升序对它们进行排序,并“取”或限制前 10000 个结果。

我可以使用什么来代替“take”,或者我可以直接在 PostgreSQL 中提出什么请求来随机抽取我的数据库记录?

postgresql sampling prisma
2个回答
1
投票

Prisma 目前不支持获取随机数据。

有一个功能请求,其中讨论了与您需要的完全相同的场景。

另一种方法是使用 queryRaw 进行原始数据库访问,并使用 PostgreSQL 的 random 函数,如上述功能请求中所述。


0
投票

重申 Nurul 的回应,Prisma 不支持这一点。

如果您有一些自动递增的字段(例如

id
),您可能会生成一个随机选择的 id 数组,然后查询这些字段。对于 100,000 或 1,000,000 的较大样本来说,这可能并不理想,但在 100 到 10,000 的情况下,我认为这可能是一个可行的后备解决方案,直到支持功能

const idsArray = [5, 9, 13, 2, 18]; // Random array of IDs

const statements = await this.prisma.statement.findMany({
    where: {
        id: {
            in: idsArray,
        },
    },
});

© www.soinside.com 2019 - 2024. All rights reserved.