#Query Flow
学 oor 最简单的方式,是先记住这一条链路:
TypeScript
raw input -> schema -> node -> adapter
#1. raw input
TypeScript
const raw = {
statusIn: ['active', 'pending'],
createdAtDay: '2026-04-08',
page: '1',
size: '20'
}
这是最普通的请求参数对象。
#2. schema
TypeScript
import { schema } from 'oor'
import { z } from 'zod'
const query = schema({
status: z.string(),
createdAt: z.date()
})
const input = query.parse(raw)
这一层负责:
- 校验字段是否合法
- 校验 suffix 是否可用
- 把字符串页码、日期等值归一化
#3. makeNode
TypeScript
import { makeNode } from 'oor'
const node = makeNode(input)
这一层把 query input 变成统一的条件树。
#4. 交给 adapter
#SQL
TypeScript
import { querySql } from 'oor/sqlite'
const sql = querySql(input, undefined, {
map: {
status: { column: 'status', type: 'string' },
createdAt: { column: 'created_at', type: 'date' }
}
})
#Elasticsearch
TypeScript
import { esBody } from 'oor/es'
const body = esBody(input, undefined, {
map: {
status: 'status.keyword',
createdAt: 'created_at'
}
})
#Drizzle
TypeScript
import { withTable } from 'oor/drizzle'
const userApi = withTable(db, users)
const list = await userApi.query(input)
#推荐顺序
对大多数项目,推荐这样理解:
- 先学
suffix - 再学
schema - 再学
condition - 最后按场景选择
sqlite / pg / mysql / es / drizzle