使用 NeoVim 研究 OpenDAL(2)

使用 NeoVim 研究 OpenDAL(2)

李仁

2025-12-31 发布62 浏览 · 0 点赞 · 0 收藏

人能常常思念,务合天理,则天心佑助,多福自臻,这福是自己求之,非幸致者。
—— 张居正《四书直解》

写在前面

本文将会详细阐述如何测试 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 老师。

目前,应急管理大学开源办公室正在加速建设,欢迎参与到 “开放原子内核观察社区” 的建设中来。

请前往 登录/注册 即可发表您的看法…