2人参与 • 2026-09-21 • Mysql
paozhu orm 可以多种不同数据库混合一起使用,满足项目多种业务代码,比如临时拼搭,paozhu orm 提供dbconver 转换命令,可以mysql、postgresql 和 sqlite 数据库之间无缝迁移。
业务代码都无需更改自动适应目标数据库,更换目标代码后重新生成适应方言数据库中间层。
paozhu orm 是c++ orm已经部分达顶级设计,比如数据库dbconver dbexport dbtable 命令数据库管理工具提供各种数据库迁移合并。
paozhu orm 的生成orm代码和数据库管理命令分开,paozhu orm生产环境时候可以不依赖数据库管理命令运行。
paozhu orm conf/orm.conf配置,支持主从读写分离,cms pg 标签是不同数据库配置,cms pg 标签用来生成命名空间隔离数据库,防止数据库表重名。
[cms] type = main host = 127.0.0.1 port = 3306 dbname = cppcms user = root password = 12345678 pretable = maxpool = 5 dbtype = mysql charset = utf8mb4 type = second host = 127.0.0.1 port = 3306 dbname = cppcms user = root password = 12345678 pretable = maxpool = 20 dbtype = mysql charset = utf8mb4 [pg] type = main host = 127.0.0.1 port = 5432 dbname = hello_world user = hello password = 12345678 pretable = maxpool = 5 dbtype = postgresql charset = utf8 #ssl=on #sslverify=on ; 校验证书链(配合系统 ca / ssl_cert_file) #sslhost=db.example.com ; 证书域名(sni + 域名校验),为空则只验证链不校验域名 type = second host = 127.0.0.1 port = 5432 dbname = hello_world user = hello password = 12345678 pretable = maxpool = 20 dbtype = postgresql charset = utf8 #ssl=on #sslverify=on #sslhost=db.example.com
paozhu orm 在这一维度上确实展现出了独特的架构优势。以下是针对“多数据库混合使用”的深度解析:
paozhu 的核心设计是将数据库类型作为模板参数注入到 orm 引擎层,而非运行时动态分发。
mysql_tag 或 postgres_tag)。.eqid(1).async_fetch() 接口完全一致。sql 方言差异(如分页 limit vs offset/fetch、引号风格)在模板特化中于编译期解决。if (db_type == mysql) 的运行时分支判断。混合使用时,编译器为每种数据库生成独立的优化代码路径。// paozhu: 无缝混合,api 完全一致,编译期确定 auto mysql_user = co_await usermysql().eqid(1).async_fetch(); // mysql 连接池 auto pg_order = co_await orderpg().equserid(1).async_fetch(); // postgresql 连接池 auto sqlite_log = co_await logsqlite().desctime().limit(100).async_fetch(); // sqlite 连接池
实际上,paozhu已经帮你生成好 mysql_user pg_order sqlite_log 了,放在models目录,无需自己手动创建,每一个表名就是一个对象,使用命名空间隔开。
ormpp 通过 dbng<t> 模板支持多数据库,但在实际混合使用时存在明显短板:
dbng<mysql> 和 dbng<postgresql> 都是同步阻塞的。在高并发混合查询场景下,你必须为每种数据库分别管理线程池或异步包装器,极易造成资源竞争和死锁。dbng 实例的连接与释放。// ormpp: 能混用,但体验割裂 dbng<mysql> mysql_db; dbng<postgresql> pg_db; // 查询接口相同,但复杂sql需手写不同方言 // 且均为同步阻塞,高并发下需额外封装异步层
drogon 的多数据库支持是“可用但笨重”的:
dbclientptr,然后在每次查询时手动传入。criteria 对象是通用的,对于数据库特有的语法(如 pg 的 jsonb 操作、mysql 的 on duplicate key),仍需回退到手写 sql。// drogon: 手动传递 client,无编译期类型安全
auto mysql_client = drogon::app().getdbclient("mysql");
auto pg_client = drogon::app().getdbclient("postgres");
// 必须手动指定 client,传错不会编译报错
auto user = co_await mapper<user>(mysql_client).findby(criteria(...));
auto order = co_await mapper<order>(pg_client).findby(criteria(...));| 维度 | paozhu orm | ormpp | drogon orm |
|---|---|---|---|
| 混合使用方式 | ✅ 模型级编译期绑定,api 统一 | ⚠️ 模板切换,api 部分统一 | ⚠️ 手动传递 dbclient,api 统一 |
| sql 方言适配 | ✅ 编译期模板特化自动处理 | ❌ 复杂查询需手写不同 sql | ⚠️ criteria 通用,特殊语法需手写 |
| 类型安全 | ✅ 编译期检查 db 类型匹配 | ⚠️ 模板参数检查 | ❌ 运行时检查,易传错 client |
| 异步混合查询 | ✅ 原生协程,独立连接池 | ❌ 同步阻塞,需额外封装 | ✅ 原生协程,但需手动管理 client |
| 连接池隔离 | ✅ 自动按 db 类型隔离 | ⚠️ 手动管理多个 dbng 实例 | ✅ 按名称隔离,但需手动获取 |
| 跨库事务 | ❌ 不支持 (业界通病) | ❌ 不支持 | ❌ 不支持 |
| 开发体验 | 🟢 无缝透明 | 🟡 简单场景好,复杂场景差 | 🟡 繁琐,易出错 |
核心在于其三层架构中的 opsql 层是一个以数据库类型为模板参数的 crtp 基类:
// 伪代码示意 paozhu 架构
template<typename model, typename dbtag>
class fk_parent_opsql : public fk_parent_base<model> {
// dbtag 决定:
// 1. 使用哪个连接池
// 2. sql 拼接规则 (引号、分页、类型转换)
// 3. 预编译语句的绑定方式
};
// 用户模型继承时已绑定具体数据库
class usermysql : public fk_parent_opsql<usermysql, mysql_tag> {};
class orderpg : public fk_parent_opsql<orderpg, postgres_tag> {};这种设计使得数据库差异在编译期被完全消除,上层业务代码看到的是完全统一的、类型安全的异步接口。而 ormpp 和 drogon 要么将差异推迟到运行时(drogon),要么将差异暴露给用户手动处理(ormpp)。
paozhu orm简单的代码演示,根据不同lite标签可以混合不同的数据库,使用标签做命名空间。
auto articles = orm::lite::fortune();
int aid = client.get["id"].to_int(); //获取url ?id=1 这种模式
articles.where("id", aid).fetch_one();如果你的项目涉及两种及以上数据库的混合使用,尤其是需要在高并发异步环境下透明地访问不同数据源:
⚠️ 注意:三者均不支持真正的跨数据库分布式事务。如需跨库事务一致性,仍需依赖外部方案(如 seata、xa 协议或应用层补偿机制)。paozhu 的优势仅限于数据访问层的无缝混合,而非事务协调层。
到此这篇关于c++ orm 多数据库异构混合使用(同一项目同时连接 mysql、postgresql 和 sqlite)的文章就介绍到这了,更多相关c++ orm 多数据库异构混合使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论