AIGC标识 mooSQL 数据库支持随笔:双族抽象之后,我们到底支持哪些库?

mooSQL 数据库支持随笔:双族抽象之后,我们到底支持哪些库?

版本对照:约 8.2 · 与仓库 DialectFactory / DataBaseType /《数据库支持清单》同步(2026-09)

写在前面

做 ORM / 数据访问层,最容易被问的一句话是:「你们支持哪些数据库?」

表面是一句产品话术,底下其实是三件事叠在一起:

  1. 方言能不能把 SQL 差异抹平(分页、参数、标识符、MERGE、Bulk……)
  2. 驱动 / TFM 能不能在目标框架上跑起来
  3. 你敢不敢对外承诺「生产可用」,而不是枚举里有个名字就算支持

mooSQL 这几年的路径,不是「每来一个库就复制一份 Dialect」,而是先把同源协议收成 Family(族),再在族上挂薄方言。这篇文章按当前代码与文档,把支持情况摊开讲一遍——给选型的人看,也给自己留个备忘。


一句话结论

覆盖面已经够宽:OLTP 三巨头 + MySQL/PG 两族衍生 + 信创 + 分析库 + 时序。短板不在「再多挂几个库」,而在支持等级分层、金仓与 Family 的关系、以及 OLAP 不能假装和 MariaDB 一样薄。

配置入口很朴素:

client.dialectFactory = new DialectFactory();

var db = new DataBase {
    dbType = DataBaseType.MariaDB, // 或 MySQL / PostgreSQL / TiDB / …
    DBConnectStr = "…"
};

完整矩阵以仓库文档为准:doc/design/features/方言/数据库支持清单.md


架构怎么收:双族 + 独立方言

自 v8.2 起,同源协议产品收敛成两大 Family:

ExtDialect
  ├─ MySqlFamilyDialect          ← MySQL wire + MySqlConnector
  │    ├─ MySQLDialect
  │    ├─ MariaDBDialect
  │    ├─ TiDBDialect
  │    └─ OBMySQLDialect         (Bulk → Fallback)
  │
  └─ PgFamilyDialect             ← PG SQL 共性;ADO 可换驱动
       ├─ NpgsqlDialect          (Bulk → COPY)
       ├─ CrateDBDialect         (Bulk → Fallback,勿吃 COPY)
       └─ OpenGaussDialect       (含 GaussDB 枚举)

其余产品是 独立方言(自有驱动与 SQL 模板),不硬塞进两族——SQL Server、Oracle、达梦、金仓、ClickHouse、DuckDB、Taos、GBase8a、SQLite、Oscar 等。

族抽象的价值很实在:同协议产品只写差分(ProviderFlags、薄 Express、覆盖 Bulk),而不是再抄一套 ADO / Option / Translator。MariaDB 就是 MySQL 族上第一个正式「有差分」的验证对象。


MySQL Family:一根线协议,多张脸

产品 DataBaseType Bulk 备注
MySQL MySQL 族默认 MySqlFamilyBulkCopyee 族内参考产品
MariaDB MariaDB 族默认 JSON Arrow 默认关、RETURNING 开
TiDB TiDB 族默认 薄方言;端口常 4000
OceanBase(MySQL 模式) OceanBase Fallback 覆盖 Bulk,避免错路径
PolarDB for MySQL 复用 MySQL 族默认 无独立枚举

共性大致是:? 参数、反引号、LIMIT/OFFSETSupportsMerge() == falseIsInsertOrUpdateSupported == true

MariaDB 和 MySQL 早已不是换皮:JSON 存储、->/->>INSERT…RETURNING、正则引擎都不完全对齐。所以新项目请直接用 MariaDB 枚举,别再「连的是 MariaDB 却配成 MySQL」——能跑 CRUD,不等于 JSON / RETURNING 路径安全。


PostgreSQL Family:SQL 像一家人,驱动可以换

产品 DataBaseType Bulk 备注
PostgreSQL PostgreSQL NpgBulkCopyee(COPY) 族参考;Merge ✅
CrateDB CrateDB Fallback(必须) 继承 Npgsql;勿吃 COPY
openGauss OpenGauss Fallback net8+:HuaweiCloud.GaussDB;低 TFM 可用 Npgsql 兼容
GaussDB GaussDB 同上 与 openGauss 共一方言类

PG 族默认 Bulk 是多行 INSERT Fallback;只有 stock PostgreSQL 覆盖成 COPY。Crate / openGauss 若误吃 COPY,线上会很难看——这是文档和冒烟里反复强调的一点。


独立方言:信创、分析、时序都在这儿

产品 枚举 成熟度(个人划分) 注意
SQL Server MSSQL 生产级 Merge ✅;分页常走 ROW_NUMBER
Oracle Oracle 生产级 Merge ✅
达梦 DM 生产级 信创主力;有独立适配文档与冒烟
人大金仓 KingBaseR3 / R6 可用 非 net451;PG 兼容模式;尚未挂入 PgFamily
SQLite SQLite 生产级 Ext LINQ 测试基线常驻
DuckDB DuckDB 可用 仅 net6+
ClickHouse ClickHouse 可用 仅 net6+;OLAP
TDengine Taos 专项 时序场景;部分 ADO 能力不支持
GBase8a GBase8a 专项 MySQL 协议相近,但是独立方言
Oscar Oscar 专项 南大通用;Merge ✅

Bulk 速查(踩坑用)

路径 默认 / 覆盖
MySQL Family 默认 MySqlFamilyBulkCopyeeOB 覆盖 Fallback
PG Family 默认 Fallback;仅 PostgreSQL 覆盖 COPY;Crate 必须 Fallback
独立方言 各自原生 BulkCopyee,或 Fallback

批量导入若「在 A 库很快、换 B 库突然变慢或报错」,先看是不是吃了错误的 Bulk 实现,而不是先怀疑业务 SQL。


我怎么给业务侧做选型(个人口径)

按场景分层承诺,比「全支持」诚实得多:

等级
生产级 SQL Server、Oracle、MySQL / MariaDB、PostgreSQL、达梦、SQLite
可用 TiDB、OceanBase(MySQL)、Crate、openGauss/GaussDB、金仓、DuckDB、ClickHouse
专项 Taos、GBase8a、Oscar
占位 Access、DB2、Informix、UX、OceanBaseOracle

速记:

  • OLTP:MSSQL / Oracle / MySQL·MariaDB / PostgreSQL
  • 信创:达梦优先;金仓、openGauss 次之(先确认目标 TFM)
  • 分析 / 嵌入式分析:ClickHouse、DuckDB(需要 .NET 6+)
  • 时序:Taos,按专项接入,不要当通用 OLTP
  • 云 MySQL / PolarDB for MySQL:直接用 MySQL 即可;无差分需求就别硬造枚举

MERGE:MySQL 族整体不走原生 MERGE(SupportsMerge() == false),插入冲突更吃 InsertOrUpdate / 业务侧策略;SQL Server、Oracle、PG 族、达梦、金仓、DuckDB、Oscar 等则 SupportsMerge() == true——写跨库 DML 时先问方言,再写「一套 SQL 打天下」。



写在后面

mooSQL 的定位一直偏「熟悉 SQL 的人用的工具」:方言抹平差异,但不假装所有库是同一个引擎。双族抽象落地之后,衍生库的边际成本下降了,也更容易诚实地区分「协议兼容」和「产品兼容」。

若你正在选型:先看 [数据库支持清单]( https://gitee.com/ …/doc/design/features/方言/数据库支持清单.md)(以你仓库路径为准),再看目标 TFM 是否注册了对应方言,最后用业务里的分页 / Bulk / MERGE / JSON 各跑一条冒烟——这比任何徽章都管用。

有实际踩坑(尤其是金仓 Bulk、openGauss 驱动切换、MariaDB JSON 运算符)欢迎留言对一对,文档和冒烟可以继续补。

posted @ 2026-09-22 23:25  sleveen  阅读(4)  评论(0)    收藏  举报