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存储过程实用脚本(二):创建函数入门
Apr 05 PostgreSQL
PostgreSQL将数据加载到buffer cache中操作方法
Apr 16 PostgreSQL
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
Apr 22 PostgreSQL
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
May 21 PostgreSQL
如何使用PostgreSQL进行中文全文检索
May 27 PostgreSQL
postgresql无序uuid性能测试及对数据库的影响
Jun 11 PostgreSQL
postgresql 删除重复数据案例详解
Aug 02 PostgreSQL
PostgreSQL13基于流复制搭建后备服务器的方法
Jan 18 PostgreSQL
PostgreSQL聚合函数介绍以及分组和排序
Apr 12 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
也谈 PHP 和 MYSQL
2006/10/09 PHP
利用php来自动调用不同服务器上的flash
2006/10/09 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
2013/11/26 PHP
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
2014/05/04 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
2016/01/05 PHP
jQuery LigerUI 使用教程表格篇(1)
2012/01/18 Javascript
Android中资源文件(非代码部分)的使用概览
2012/12/18 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
Javascript对象Clone实例分析
2015/06/09 Javascript
js从外部获取图片的实现方法
2016/08/05 Javascript
JS/jQuery判断DOM节点是否存在的简单方法
2016/11/24 Javascript
jQuery实现遍历复选框的方法示例
2017/03/06 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
Node.js中的cluster模块深入解读
2018/06/11 Javascript
vue+elementUI动态生成面包屑导航教程
2019/11/04 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
2019/11/14 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
举例讲解Python中的算数运算符的用法
2015/05/13 Python
利用Django-environ如何区分不同环境
2018/08/26 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
简单了解如何封装自己的Python包
2020/07/08 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
canvas实现圆形进度条动画的示例代码
2017/12/26 HTML / CSS
新奇的小玩意:IWOOT
2016/07/21 全球购物
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
西安启天科技有限公司网络工程师面试题笔试题
2016/06/12 面试题
外企测试工程师面试题
2015/02/01 面试题
幼儿园元旦家长感言
2014/02/27 职场文书
幼儿园中班区域活动总结
2014/07/09 职场文书
安全标兵事迹材料
2014/08/17 职场文书
管理岗位竞聘演讲稿
2014/08/18 职场文书
高中课前三分钟演讲稿
2014/09/13 职场文书