欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-09 22:50:44
pgxr 是一个 rust 的 crate 库,可以实现用 rust 语言来编写 postgresql 的扩展函数(相当于存储过程)。这次,我们使用 postgres 这个 crate 来连接和操作...

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 数据库内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!