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
Centos环境下Postgresql 安装配置及环境变量配置技巧
May 18 PostgreSQL
通过Qt连接OpenGauss数据库的详细教程
Jun 23 PostgreSQL
postgresql使用filter进行多维度聚合的解决方法
Jul 16 PostgreSQL
PostgreSQL自动更新时间戳实例代码
Nov 27 PostgreSQL
基于PostgreSQL/openGauss 的分布式数据库解决方案
Dec 06 PostgreSQL
PostgreSQL13基于流复制搭建后备服务器的方法
Jan 18 PostgreSQL
Oracle配置dblink访问PostgreSQL的操作方法
Mar 21 PostgreSQL
PostgreSQL数据库创建并使用视图以及子查询
Apr 11 PostgreSQL
PostgreSQL基于pgrouting的路径规划处理方法
Apr 18 PostgreSQL
PostgreSQL出现死锁该如何解决
May 30 PostgreSQL
postgresql中如何执行sql文件
May 08 PostgreSQL
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
PostGIS的安装与入门使用指南
PostgreSQL13基于流复制搭建后备服务器的方法
基于PostgreSQL/openGauss 的分布式数据库解决方案
PostgreSQL自动更新时间戳实例代码
Nov 27 #PostgreSQL
关于PostgreSQL JSONB的匹配和交集问题
Sep 14 #PostgreSQL
postgresql 删除重复数据案例详解
Aug 02 #PostgreSQL
You might like
用ODBC的分页显示
2006/10/09 PHP
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
学习php设计模式 php实现装饰器模式(decorator)
2015/12/07 PHP
PHP数组相加操作及与array_merge的区别浅析
2016/11/26 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
浅谈JavaScript字符串与数组
2015/06/03 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
AngularJS 模块化详解及实例代码
2016/09/14 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
JS实现将链接生成二维码并转为图片的方法
2018/03/17 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
js使用formData实现批量上传
2020/03/27 Javascript
深入理解JavaScript 箭头函数
2019/05/30 Javascript
JS实现秒杀倒计时特效
2020/01/02 Javascript
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
教你用一行Python代码实现并行任务(附代码)
2018/02/02 Python
python smtplib发送带附件邮件小程序
2018/05/22 Python
python DataFrame 取差集实例
2019/01/30 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
python实现字符串加密 生成唯一固定长度字符串
2019/03/22 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
2021/02/03 Python
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
护士思想汇报
2014/01/12 职场文书
优秀干部获奖感言
2014/01/31 职场文书
幼儿园教师节活动总结
2015/03/23 职场文书
酒店宣传语大全
2015/07/13 职场文书
幼儿园开学家长寄语(2016春季)
2015/12/03 职场文书
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python
Python使用PyYAML库读写yaml文件的方法
2022/04/06 Python