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
浅谈PostgreSQL表分区的三种方式
Jun 29 PostgreSQL
PostgreSQL解析URL的方法
Aug 02 PostgreSQL
关于PostgreSQL JSONB的匹配和交集问题
Sep 14 PostgreSQL
PostGIS的安装与入门使用指南
Jan 18 PostgreSQL
Rust 连接 PostgreSQL 数据库的详细过程
Jan 22 PostgreSQL
PostgreSQL并行计算算法及参数强制并行度设置方法
Apr 06 PostgreSQL
PostgreSQL并行计算算法及参数强制并行度设置方法
Apr 07 PostgreSQL
PostgreSQL聚合函数介绍以及分组和排序
Apr 12 PostgreSQL
postgreSQL数据库基础知识介绍
Apr 12 PostgreSQL
PostgreSQL基于pgrouting的路径规划处理方法
Apr 18 PostgreSQL
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
PostGIS的安装与入门使用指南
PostgreSQL13基于流复制搭建后备服务器的方法
基于PostgreSQL/openGauss 的分布式数据库解决方案
PostgreSQL自动更新时间戳实例代码
Nov 27 #PostgreSQL
关于PostgreSQL JSONB的匹配和交集问题
Sep 14 #PostgreSQL
postgresql 删除重复数据案例详解
Aug 02 #PostgreSQL
You might like
php中current、next与reset函数用法实例
2014/11/17 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
2015/04/09 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
PDO::errorCode讲解
2019/01/28 PHP
Javascript中的数学函数集合
2007/05/08 Javascript
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
详解Angular5 路由传参的3种方法
2018/04/28 Javascript
AngularJs中$cookies简单用法分析
2019/05/30 Javascript
JavaScript基础之this和箭头函数详析
2019/09/05 Javascript
微信小程序canvas截取任意形状的实现代码
2020/01/13 Javascript
vue使用screenfull插件实现全屏功能
2020/09/17 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
python操作redis方法总结
2018/06/06 Python
python使用scrapy发送post请求的坑
2018/09/04 Python
详解django的serializer序列化model几种方法
2018/10/16 Python
python3爬虫怎样构建请求header
2018/12/23 Python
python处理“
2019/06/10 Python
Ubuntu16.04安装python3.6.5步骤详解
2020/01/10 Python
通过实例解析Python文件操作实现步骤
2020/09/21 Python
英国虚拟主机服务商:eUKhost
2016/08/16 全球购物
StubHub新西兰:购买和出售你的门票
2019/04/22 全球购物
SQL Server面试题
2013/04/04 面试题
最新个人职业生涯规划书
2014/01/22 职场文书
护理学应聘自荐书范文
2014/02/05 职场文书
工作迟到检讨书
2014/02/21 职场文书
大学军训感言600字
2014/02/25 职场文书
就职演讲稿范文
2014/05/19 职场文书
学雷锋日活动总结
2015/02/06 职场文书
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS
Python中glob库实现文件名的匹配
2021/06/18 Python
在MySQL中你成功的避开了所有索引
2022/04/20 MySQL
清空 Oracle 安装记录并重新安装
2022/04/26 Oracle