
使用 NeoVim 研究 OpenDAL(2)
人能常常思念,务合天理,则天心佑助,多福自臻,这福是自己求之,非幸致者。
—— 张居正《四书直解》
写在前面
本文将会详细阐述如何测试 OpenDAL 的 PostgreSQL 特性。
搭建 PostgreSQL 环境
# 假定在 Fedora Linux 环境下
sudo dnf install postgresql-server
sudo /usr/pgsql-18/bin/postgresql-18-setup initdb
sudo systemctl enable postgresql-18
sudo systemctl start postgresql-18
sudo passwd -d postgres
# 在调整验证方式前,需要先切换用户为 postgres 再连接
su postgres
psql -d postgres
按照上述步骤以后,尝试执行 SELECT VERSION();

(这便是 PostgreSQL 正确安装以后的场景)
测试数据准备

(首先,我们需要理解 OpenDAL 看待 PostgreSQL 等数据存储后端的方式:文件系统)
/* 假定已经通过 psql 连接到 PostgreSQL,数据库为 postgres */
/* 创建名为 example 的数据表 */
create table example (
/* "文件名" */
filename text,
/* "文件数据" */
filedata bytea,
/* 用于存储 "文件名" 的一列必须具有唯一性约束,否则 OpenDAL 会报错 */
unique(filename)
);
OpenDAL 追求接口一致性的做法,在统一各个存储后端访问 api 的同时,往往也使得我们
很难以发挥出每个存储后端可能有的独特特性的能力
(好的研发要能够在两者中取得平衡)。
OpenDAL PostgreSQL 测试项目准备
在已经 clone 好的 opendal 目录下,执行如下指令:
# 我们的实验将在一个新的 work 分支上面展开
git branch work
git checkout work
# 创建所需 Rust 项目,引入特性
cargo new neovim_postgresql
cd neovim_postgresql
cargo add anyhow tokio
# 打开 tokio 库的全部特性
cargo add tokio --features full
# 打开 OpenDAL PostgreSQL 服务特性
cargo add opendal --features services-postgresql
解决可能的 'role ... does not exist' 问题
在默认安装的 PostgreSQL 中,对于本地连接采用的是 Peer 验证方式,这种方式就是根据当前操作系统的用户名称,作为连接 PostgreSQL 的用户名称(而且无视 psql -U 指定用户名),因此如果我们贸然直接连接,往往会出现如下的问题:


(可以看出,两者本质上就是对于同一种问题的不同表述)
解决的办法就是调整验证方式,继续使用 psql 连接 PostgreSQL,执行 show hba_file;

之后,使用 sudo nvim [文件地址] 调整验证方式为 trust(参考 https://www.postgresql.org/docs/current/auth-trust.html)。

使用 :w 保存之后,执行 sudo systemctl restart postgresql 重启 postgresql.
调整项目代码
重新打开 neovim_postgresql 下 src 目录里面的 main.rs,调整代码为:

use anyhow::Result;
use opendal::Operator;
use opendal::services::Postgresql;
```rust
#[tokio::main]
async fn main() -> Result<()> {
let builder = Postgresql::default()
.root("/")
.connection_string("postgresql://localhost/postgres")
.table("example")
.key_field("filename")
.value_field("filedata");
let op = Operator::new(builder)?.finish();
/* 将 `Hello PostgreSQL` 写入到一个名为 `postgres.txt` 的文件夹中 */
op.write("postgres.txt", "Hello PostgreSQL").await?;
/* 构建 Reader */
let bs = op.read("postgres.txt").await?;
/* 提取 Buffer 中的内容,即为文件内容 */
println!("{:?}", String::from_utf8(bs.to_vec()).unwrap());
Ok(())
}
之后,在 neovim_postgresql 目录下,执行 cargo run 命令进行测试.

同时,我们可以依托 psql 查看数据表里面发生的变化。
```shell
psql -d postgres
select * from example;

可以看出,OpenDAL 已经在数据表内插入了新的数据,而展现给我们的结果,则是 OpenDAL “翻译” 后的内容。
写在最后
由此,我们已经构建出了一个研究 Apache OpenDAL 的基本环境,之后的文章,我们详细介绍如何进行特性改进。
感谢应急管理大学开源办公室袁国铭主任与合作顾问魏波、王其达老师,感谢开放原子开源基金会张凯老师、臧秀涛老师,感谢 OpenDAL 社区尚卓燃(@psiace),感谢 NoSQL-CN 社区 @Alex 与 @Bitstring 老师。
目前,应急管理大学开源办公室正在加速建设,欢迎参与到 “开放原子内核观察社区” 的建设中来。

