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
Centos环境下Postgresql 安装配置及环境变量配置技巧
May 18 PostgreSQL
如何使用PostgreSQL进行中文全文检索
May 27 PostgreSQL
PostgreSQL自动更新时间戳实例代码
Nov 27 PostgreSQL
PostgreSQL13基于流复制搭建后备服务器的方法
Jan 18 PostgreSQL
PostgreSQL数据库创建并使用视图以及子查询
Apr 11 PostgreSQL
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
Apr 12 PostgreSQL
PostgreSQL数据库去除重复数据和运算符的基本查询操作
Apr 12 PostgreSQL
postgreSQL数据库基础知识介绍
Apr 12 PostgreSQL
PostgreSQL基于pgrouting的路径规划处理方法
Apr 18 PostgreSQL
PostgreSQL出现死锁该如何解决
May 30 PostgreSQL
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
PostGIS的安装与入门使用指南
PostgreSQL13基于流复制搭建后备服务器的方法
基于PostgreSQL/openGauss 的分布式数据库解决方案
PostgreSQL自动更新时间戳实例代码
Nov 27 #PostgreSQL
关于PostgreSQL JSONB的匹配和交集问题
Sep 14 #PostgreSQL
postgresql 删除重复数据案例详解
Aug 02 #PostgreSQL
You might like
一个SQL管理员的web接口
2006/10/09 PHP
PHP使用数组依次替换字符串中匹配项
2016/01/08 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
YII2框架中查询生成器Query()的使用方法示例
2020/03/18 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
Javascript 写的简单进度条控件
2008/01/22 Javascript
jQuery 可以拖动的div实现代码 脚本之家修正版
2009/06/26 Javascript
Javascript解决常见浏览器兼容问题的12种方法
2010/01/04 Javascript
JavaScript面向对象之静态与非静态类
2010/02/03 Javascript
基于jquery实现控制经纬度显示地图与卫星
2013/05/20 Javascript
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
a标签跳转到指定div,jquery添加和移除class属性的实现方法
2016/10/10 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
React Ant Design树形表格的复杂增删改操作
2020/11/02 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
2015/08/16 Python
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
浅析Python中else语句块的使用技巧
2016/06/16 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
2018/07/13 Python
Python检测数据类型的方法总结
2019/05/20 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
使用Python将图片转正方形的两种方法实例代码详解
2020/04/29 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
联想印度官方网上商店:Lenovo India
2019/08/24 全球购物
成功的餐厅经营创业计划书
2014/01/15 职场文书
签约仪式策划方案
2014/06/02 职场文书
2014教师“四风问题”对照检查材料思想汇报
2014/09/16 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
放射科岗位职责
2015/02/14 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书