数据类型标准化
- BigInt 转换
- JavaScript BigInt → Number 用于比较
- Decimal 处理
- Prisma Decimal → 10 位精度的 Float
- 日期标准化
- 所有 DateTime 值 → null(专注于数据,而非时间戳)
- JSON 解析
- 自动检测和解析 JSON 字符串
- 对象键排序
- 按字母顺序排序以确保一致比较
当前验证覆盖 PostgreSQL 与 SQLite 上的受支持读取,并提供 Prisma v6、v7、v8、Drizzle 和生成 SQL 的基准测试报告。
每个测试都遵循严格的 5 步验证流程,以确保生成的 SQL 产生与 Prisma 相同的结果
解析 Prisma 查询参数并使用相同的模型和 schema 生成等效 SQL。生成的 SQL 使用参数化查询以确保安全性和性能。
通过 postgres.js 或 better-sqlite3 直接运行生成的 SQL,并通过 Prisma 执行相同的查询。两者都针对相同的数据库状态。
处理类型差异(BigInt vs Number、Decimal 精度、Date 序列化)并标准化对象键顺序以便公平比较。
验证结果完全匹配:相同的行数、相同的字段值、相同的嵌套关系、相同的顺序。任何不匹配都会导致测试失败。
使用 5 次预热运行测量执行时间,然后对每个测试平均 10-50 次迭代。与 Prisma v6、Prisma v7、Prisma v8 和 Drizzle ORM 进行比较。
测试涵盖跨多个复杂级别的每个 Prisma 读取操作
查看我们如何验证带关系过滤器的复杂嵌套查询
it('nested relation filter', () =>
runParityTest(
db,
benchmarkResults,
'findMany nested relation',
'Organization',
{
method: 'findMany',
where: {
projects: {
some: {
tasks: { some: { status: 'DONE' } }
}
}
}
},
() => db.prisma.organization.findMany({
where: {
projects: {
some: {
tasks: { some: { status: 'DONE' } }
}
}
},
orderBy: { id: 'asc' }
}),
)
)
// runParityTest 内部流程:
// 1. 使用参数调用 generateSQL()
// 2. 直接执行生成的 SQL
// 3. 执行 Prisma 查询
// 4. 标准化两个结果
// 5. 深度相等性检查 - 任何差异都会失败
// 6. 执行时间基准测试generateSQL() 函数解析 Prisma 参数并创建参数化 SQL。此步骤单独计时以测量查询生成开销。
两个查询通过 Promise.all() 同时访问相同的数据库状态,确保公平比较和相同的数据条件。
结果经过递归标准化:BigInt→Number、Decimal→Float(10)、Date→null、JSON 解析、键排序。这确保了逐字节比较的准确性。
零容差的 JSON stringify 比较。行数、字段值、嵌套对象或顺序的任何不匹配都会导致测试失败,并提供详细的差异输出。
验证后,5-50 次迭代测量平均执行时间。结果包括:Prisma v6、Prisma v7、Prisma v8、Drizzle ORM、生成的 SQL 和 SQL 生成开销。
每个纳入基准测试的测试都会在受支持的情况下于 Prisma v6、v7 和 v8 上运行:
所有基准测试结果都自动生成并存储为 JSON 文件,以确保完全透明: