方言差异
ts-grm 的核心从不写死 SQL 方言:driver 上报自己的能力,SQL 生成按能力分支。因此同一条查询在六种数据库上生成不同但等价的 SQL。
分页差异:paginationStrategy
驱动声明自己的分页策略,切片(fetchPage/fetchRange)据此生成:
| 策略 | 形态 | 适用 |
|---|---|---|
STANDARD_OFFSET_FETCH | LIMIT x OFFSET y(PG/MySQL/SQLite)或 OFFSET y ROWS FETCH NEXT x ROWS ONLY(SQL Server 2012+) | 大多数现代库 |
| 专用策略 | 兜底(Oracle 的 ROWNUM 包装、旧版 SQL Server 的 ROW_NUMBER() over(...)) | 老版本数据库 |
对应驱动动了手:上游测试里 SqlServer2012Driver 返回 STANDARD_OFFSET_FETCH;OracleDriver / SqlServerDriver 走各自兼容路径(驱动测试文件 oracle_12.test.ts / sqlserver_2012.test.ts 覆盖)。
其它常见差异面
- 保留字与大小写:驱动决定引用策略(
keywordStrategy);PostgreSQL 未引号标识符会小写化——命名策略产出大写列名时由驱动/引用规则兜底; - 日期时间:
prop.dt()的序列化形态随驱动调整(Oracle 测试中有TIMESTAMP '...'转换逻辑); - 布尔/数值:SQL Server 的 true/false 字面量、MySQL 的引号风格等,在驱动测试里都有专属转换(
useSqlServerClientWithData等); - 无序分页:部分驱动不支持无排序分页(
isUnorderedPaginationSupported),构建时可禁用以提前报错(isUnorderedPaginationDisabled)。
在本教程里怎么看
沙盒跑 PostgreSQL:你实际看到的 SQL 就是 PG 方言。想对比方言形态,可直接参考上游各驱动测试的 SQL 断言(链接见「关于本教程」)。
写给跨库项目
- 先定 driver,再写查询:行为差异尽量收敛到 driver 层,业务代码不感知方言;
dsl.native无法跨库:原生片段绑死当前方言,跨库时移入策略层或避免;- 事务/日志/模式创建等能力六库通用(非系统表查询差异由驱动内部处理)。