TSts-grm

方言差异

ts-grm 的核心从不写死 SQL 方言:driver 上报自己的能力,SQL 生成按能力分支。因此同一条查询在六种数据库上生成不同但等价的 SQL。

分页差异:paginationStrategy

驱动声明自己的分页策略,切片(fetchPage/fetchRange)据此生成:

策略形态适用
STANDARD_OFFSET_FETCHLIMIT 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_FETCHOracleDriver / 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 无法跨库:原生片段绑死当前方言,跨库时移入策略层或避免;
  • 事务/日志/模式创建等能力六库通用(非系统表查询差异由驱动内部处理)。