文盘 Rust -- 安全连接 TiDB/Mysql
作者:京东科技 贾世闻
最近在折腾 rust 与数据库集成,为了偷懒,选了 Tidb Cloud Serverless Tier 作为数据源。Tidb 无疑是近五年来最优秀的国产开源分布式数据库,Tidb Cloud Serverless Tier 作为 pingcap 旗下的云产品方便又经济,这次使用还有一些小惊喜,这个后文再说。
Tidb Cloud Serverless Tier 的使用文档还是很全面的,详细情况请参考使用 TiDB Cloud (Serverless Tier) 构建 TiDB 集群.
集群建立完成后,Tidb Cloud Serverless Tier 有个小功能是可以显示主流客户端以及流行编程语言的连接代码。包括: MysqlCli、MyCli、JDBC、Python、golang 以及 Nodejs。
嗯?rust 的代码在哪儿?很遗憾没有 rust 的代码。而且为了安全起见,Tidb Cloud Serverless Tier 貌似只支持安全连接。在查找文档过程中 rust 的 数据库驱动和很多 orm 文档中也没有关于安全详细的描述,不少思路是在 issues 里面给出的。索性把 rust 连接 mysql 主流方式的安全连接代码都记录下来,一来给自己留个备忘,二来给需要的同学做个提示。
以下实例所使用的的标的建表语句如下
mysql rust driver
rust-mysql-simple,纯 rust 实现的 mysql 驱动。
依赖
代码
代码并不复杂,首先创建 SslOpts,指定 CA 文件的位置;然后使用 OptsBuilder 生成链接配置信息;最后创建 Connection。后面是执行表创建以及验证链接,最后是对标的 insert 和 select 操作。
sqlx
sqlx是纯 Rust 编写的异步 SQL Crate。
依赖
代码
SeaORM
SeaORM是在 sqlx 之上构建的 orm 框架。
依赖
代码
SeaOrm 依赖 sqlx。首先构建 sqlx::MySqlConnectOptions 然后根据 MySqlConnectOptions 构建 sqlx::MySqlPool 最后构建 sea_orm::SqlxMySqlConnector 用于与 mysql 通信。
Rbatis
依赖
代码
首先,新建一个 Rbatis struct;构建 rbdc_mysql::options::MySqlConnectOptions (rbdc 相当于 java 体系里的 jdbc,是 rbatis 的衍生项目);最后通过配置好的 rbdc_mysql::options::MySqlConnectOptions 初始化 Rbatis。
后记
在这次实验中笔者也试图使用Diesel建立 mysql 安全连接,不过在编译的时候失败,未入门先放弃。Diesel 由于开发时间久远,彼时各个数据库的 rust 原生驱动缺失,所以大量才用 c/c++ driver 进行构建,这次编译失败也是因为在 macos 上找不到 mysqlclient 导致。有对 Diesel 强依赖的同学可以继续探索。 再来说说对 SeaOrm 和 Rbatis 的直观感受。SeaOrm 构建实体比较麻烦,如果不是通过工具手工构建实体比较烧脑;实体中包含各种与其他实体的关系;动态 sql 可以通过 sea_query 工具包来构建。Rbatis 构建实体心智负担就小很多,一张表一个实体;动态 sql 可以通过 HtmlSql 和 PySql 实现,sql 与代码充分解耦。rbdc 作为 Rbatis 的衍生项目,显然是要做 rust 生态的 JDBC。从感觉上来讲 SeaOrm 更像 hibernate;而 Rbatis 是复刻 Mybatis。 数据库是应用程序打交道最多的外部资源,相关话题也很多,有机会再和大家聊聊 rust 与 数据库打交道的更多细节。
咱们下期见。
版权声明: 本文为 InfoQ 作者【京东科技开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/e63847aca60e8c5e87718edec】。文章转载请联系作者。
评论