Rust 连接 PostgreSQL 数据库的详细过程


Posted in PostgreSQL onJanuary 22, 2022

pgxr 是一个 Rust 的 crate 库,可以实现用 Rust 语言来编写 PostgreSQL 的扩展函数(相当于存储过程)。

这次,我们使用 postgres 这个 crate 来连接和操作 PostgreSQL 数据库。

创建好项目后,在 cargo.toml 里添加 postgres 的依赖:

Rust 连接 PostgreSQL 数据库的详细过程

首先,导入相关的类型,并创建一个 Person struct:

Rust 连接 PostgreSQL 数据库的详细过程

再创建 create_db 函数,用来创建数据库和表,它返回一个 Result,里面可能是 Client 或错误:

注意,Client::connect() 函数所接受的连接字符串可以是两种形式的:

Rust 连接 PostgreSQL 数据库的详细过程

Key-Value 形式。例如:Client::connect("host=localhost user=postgres", NoTls)?; 具体的 key 需要查阅官方文档。URL 形式。本例中使用的是 URL 形式。

一个相对完整的数据库连接字符串 URL 格式是:

postgres://username[:password]@host[:port][/database],其中 password、port、database 都是可选的。所以上面代码中做了相应的判断处理。

Client::connect() 函数的第二个参数用的是 NoTls,为了简单起见,这里我们不使用 TLS。

第 30、32 行,使用 Client 的 execute 方法先删除数据表(如果存在的话),然后再创建 person 表。

最后返回 Client。

接下来,创建 insert_data 函数,来插入一些数据:

Rust 连接 PostgreSQL 数据库的详细过程

注意该函数的参数 Client 必须是 mut 的。

再创建一个查询数据的函数:

Rust 连接 PostgreSQL 数据库的详细过程

这里,我们直接对 Client 的 query 方法返回的结果进行遍历,最后方法返回一个 Vec。

最后,在 main 函数里依次调用这些函数,并把查询结果打印出来:

Rust 连接 PostgreSQL 数据库的详细过程

结果如下:

Rust 连接 PostgreSQL 数据库的详细过程

全部代码如下:

use postgres::{error::Error, Client, NoTls};
 
#[derive(Debug)]
struct Person {
    id: i32,
    name: String,
    data: Option<Vec<u8>>,
}
fn create_db() -> Result<Client, Error> {
    let username = "postgres";
    let password = "postgres";
    let host = "localhost";
    let port = "5432";
    let database = "rust2021";
    let conn_str = &format!(
        "postgres://{}{}{}@{}{}{}{}{}",
        username,
        if password.is_empty() { "" } else { ":" },
        password,
        host,
        if port.is_empty() { "" } else { ":" },
        port,
        if database.is_empty() { "" } else { "/" },
        database
    );
    let mut client = Client::connect(conn_str, NoTls)?;
    let _ = client.execute("DROP TABLE person", &[]);
    client.execute(
        "CREATE TABLE person (
        id      SERIAL PRIMARY KEY,
        name    TEXT NOT NULL,
        data    BYTEA
    )",
        &[],
    )?;
    Ok(client)
fn insert_data(client: &mut Client) -> Result<(), Error> {
    let p1 = Person {
        id: 1,
        name: "Dave".to_string(),
        data: None,
    };
    let p2 = Person {
        id: 2,
        name: "Nick".to_string(),
        "INSERT INTO person (id, name, data)
    VALUES ($1, $2, $3),
    ($4, $5, $6)",
        &[&p1.id, &p1.name, &p1.data, &p2.id, &p2.name, &p2.data],
    Ok(())
fn get_data(client: &mut Client) -> Result<Vec<Person>, Error> {
    let mut persons = Vec::new();
    for row in client.query("SELECT id, name, data FROM person", &[])? {
        persons.push(Person {
            id: row.get(0),
            name: row.get(1),
            data: row.get(2),
        });
    }
    Ok(persons)
fn main() -> Result<(), Error> {
    let mut client = create_db()?;
    insert_data(&mut client)?;
    let persons = get_data(&mut client)?;
    for p in persons {
        println!("Person: {:?}", p);

到此这篇关于Rust 连接 PostgreSQL 数据库的文章就介绍到这了,更多相关Rust  PostgreSQL 数据库内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PostgreSQL 相关文章推荐
PostgreSQL将数据加载到buffer cache中操作方法
Apr 16 PostgreSQL
如何使用PostgreSQL进行中文全文检索
May 27 PostgreSQL
postgres之jsonb属性的使用操作
Jun 23 PostgreSQL
PostgreSQL解析URL的方法
Aug 02 PostgreSQL
PostgreSQL聚合函数介绍以及分组和排序
Apr 12 PostgreSQL
postgreSQL数据库基础知识介绍
Apr 12 PostgreSQL
PostgreSQL基于pgrouting的路径规划处理方法
Apr 18 PostgreSQL
PostgreSQL出现死锁该如何解决
May 30 PostgreSQL
PostgreSQL之连接失败的问题及解决
May 08 PostgreSQL
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
PostGIS的安装与入门使用指南
PostgreSQL13基于流复制搭建后备服务器的方法
基于PostgreSQL/openGauss 的分布式数据库解决方案
PostgreSQL自动更新时间戳实例代码
Nov 27 #PostgreSQL
关于PostgreSQL JSONB的匹配和交集问题
Sep 14 #PostgreSQL
postgresql 删除重复数据案例详解
Aug 02 #PostgreSQL
You might like
DIY实用性框形天线
2021/03/02 无线电
改德生G88 - 加装等响度低音提升电路
2021/03/02 无线电
PHP flock 文件锁详细介绍
2012/12/29 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
wampserver改变默认网站目录的办法
2015/08/05 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
js导航菜单(自写)简单大方
2013/03/28 Javascript
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
javascript阻止scroll事件多次执行的思路及实现
2013/11/08 Javascript
jQuery监控文本框事件并作相应处理的方法
2015/04/16 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
JS中mouseup事件丢失的原因与解决办法
2017/06/14 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
2017/12/20 Javascript
JavaScript接口实现方法实例分析
2020/05/16 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
[00:27]DOTA2次级职业联赛 - Lilith战队宣传片
2014/12/01 DOTA
[04:19]DOTA2完美大师赛第四天精彩集锦
2017/11/26 DOTA
初步讲解Python中的元组概念
2015/05/21 Python
Python 串口读写的实现方法
2019/06/12 Python
python turtle库画一个方格和圆实例
2019/06/27 Python
python的scipy.stats模块中正态分布常用函数总结
2021/02/19 Python
Mankind西班牙男士护肤品网站:购买皮肤护理、护发和剃须
2017/04/27 全球购物
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
经典演讲稿范文
2013/12/30 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
小学捐书活动总结
2014/07/05 职场文书
关于运动会的广播稿(10篇)
2014/09/12 职场文书
党员群众路线学习心得体会
2014/11/04 职场文书
幼师辞职信怎么写
2015/02/27 职场文书
2015年三好一满意工作总结
2015/07/24 职场文书
Java8中接口的新特性使用指南
2021/11/01 Java/Android
人物搭配车车超萌联名预备中 【咒术迴战】 ⨯ 【天竺鼠车车】 展开合作
2022/04/11 日漫
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers