【rust】8、连接数据库:sqlx

这篇具有很好参考价值的文章主要介绍了【rust】8、连接数据库:sqlx。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

sqlx 是 rust 的数据库访问工具, 本身并不是 orm,但常见的 orm 都是基于它实现的。其有如下特点:

  • 支持异步,适合高并发
  • 编译时检查:cargo build 时检查执行 sql,校验响应值
  • 支持多数据库:mysql、pg、sqlite 等
  • 支持主流 rust 运行时:tokio、async-std、actix、native-tls、rustls等
  • 内置连接池

一、数据库、依赖、环境变量

本文操作 pg,首先建表

DROP TABLE IF EXISTS course;
CREATE TABLE course (
    id INT8 NOT NULL,
    teacher_id INT4 NOT NULL,
    name VARCHAR(255) NOT NULL,
    time DATE DEFAULT NOW()
);
INSERT INTO course VALUES (1, 11, 'cml', '2022-03-25');
INSERT INTO course VALUES (2, 22, 'cc', '2022-03-25');
INSERT INTO course VALUES (3, 33, 'mm', '2022-03-25');
ALTER TABLE course ADD CONSTRAINT course_pkey PRIMARY KEY (id);

用 cargo new 新建项目,添加依赖:

cargo add sqlx -F postgres -F runtime-tokio-rustls -F macros -F chrono
cargo add dotenv # 环境变量工具。本例中将使用此工具处理数据库连接字符串。
cargo add chrono -F serde # 时间工具
cargo add serde -F derive # 序列化
cargo add actix-web # actix 运行时
cargo add actix-rt # actix 运行时

环境变量

数据库地址可以放在配置文件里,例如在根目录新建一个 .env 文件,内容如下:

DATABASE_URL=postgres://cml:123456@192.168.1.239:5432/postgres

二、增删改查

2.1 完整示例

  • dotenv().ok():在访问环境变量之前检查一下,防止因读取环境变量失败导致程序 panic。
  • env::var(“DATABASE_URL”):读取环境变量文件中的数据库连接字符串
  • PgPoolOptions::new().connect():实例化一个数据库连接池
  • sqlx::query!(“sql”) .fetch_all(&pool):执行sql语句

工程目录结构:

│  .env
│  Cargo.toml 
├─src
│      main.rs

示例代码:

use chrono::NaiveDate;
use dotenv::dotenv;
use sqlx::postgres::PgPoolOptions;
use std::env;

#[derive(Debug)]
pub struct Course {
    pub id: i64,
    pub teacher_id: i32,
    pub name: String,
    pub time: Option<NaiveDate>,
}

#[actix_rt::main]
async fn main() -> Result<(), sqlx::Error> {
    println!("Hello, world!");
    dotenv().ok();
    读取所有的环境变量
    // for (key, value) in env::vars() {
    //     println!("环境变量内容:{}: {}", key, value);
    // }
    let connection_str = env::var("DATABASE_URL")
        .expect("数据库连接字符串获取失败,请检查env文件是否已配置数据库连接字符串");
    println!("数据库连接字符串是:{}", connection_str);
    let pool = PgPoolOptions::new()
        .max_connections(5)
        .connect(&connection_str)
        .await?;
    println!("db_pool is : {:?}", pool);
    //查询所有
    let list = sqlx::query!("select * from course")
        .fetch_all(&pool)
        .await?;
    let mut vec = vec![];
    for row in list {
        vec.push(Course {
            id: row.id,
            teacher_id: row.teacher_id,
            name: row.name,
            time: row.time,
        })
    }
    println!("数据库中的所有数据:{:#?}", vec);
    //查询单个
    let list2 = sqlx::query!(r#"select * from course where id = $1"#, 1)
        .fetch_all(&pool)
        .await?;
    let mut vec2 = vec![];
    for row in list2 {
        vec2.push(Course {
            id: row.id,
            teacher_id: row.teacher_id,
            name: row.name,
            time: row.time,
        })
    }
    println!("查询单个{:#?}", vec2);
    // 增加
    let insert = sqlx::query!(
        r#"INSERT INTO course VALUES ($1, $2, $3)"#,
        100000,
        11,
        "gg"
    )
    .fetch_all(&pool)
    .await?;
    // 更新
    let update = sqlx::query!(r#"update course set name=$1"#, "ogg")
        .fetch_all(&pool)
        .await?;
    Ok(())
}

// cargo r
Hello, world!
数据库连接字符串是:postgres://postgres:pass@ip:5432/postgres
db_pool is : Pool { size: 1, num_idle: 1, is_closed: false, options: PoolOptions { max_connections: 5, min_connections: 0, connect_timeout: 30s, max_lifetime: Some(1800s), idle_timeout: Some(600s), test_before_acquire: true } }
数据库中的所有数据:[
    Course {
        id: 1,
        teacher_id: 11,
        name: "cml",
        time: Some(
            2022-03-25,
        ),
    },
    Course {
        id: 2,
        teacher_id: 22,
        name: "cc",
        time: Some(
            2022-03-25,
        ),
    },
    Course {
        id: 3,
        teacher_id: 33,
        name: "mm",
        time: Some(
            2022-03-25,
        ),
    },
]
查询单个[
    Course {
        id: 1,
        teacher_id: 11,
        name: "cml",
        time: Some(
            2022-03-25,
        ),
    },
]

// 执行完时,查询数据库如下:
postgres=# select * from course;
   id   | teacher_id | name |    time
--------+------------+------+------------
      1 |         11 | ogg  | 2022-03-25
      2 |         22 | ogg  | 2022-03-25
      3 |         33 | ogg  | 2022-03-25
 100000 |         11 | ogg  | 2024-02-21
(4 rows)

参考:https://www.cnblogs.com/Naylor/p/16062584.html

【rust】8、连接数据库:sqlx,# rust,rust,数据库,jvm文章来源地址https://www.toymoban.com/news/detail-836145.html

2.2 query

let sql = format!(r#"DROP TABLE IF EXISTS {}"#, tmp_table_name);
let r = sqlx::query(&sql).execute(&pool).await?;
println!("sql: {} r: {:?}", sql, r);

到了这里,关于【rust】8、连接数据库:sqlx的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据库设计、JDBC、数据库连接池

    数据库设计概念 数据库设计就是根据业务 系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。 建立数据库中的表结构以及表与表之间的关联关系的过程。 有哪些表?表里有哪些字段?表和表之间有什么关系? 数据库设计的步骤 需求分析(数据是

    2024年02月19日
    浏览(48)
  • 什么是 Java 中的数据库连接池?为什么使用连接池来管理数据库连接?

    数据库连接池(database connection pool)是在 Java 中用于管理数据库连接的一种技术。它的主要目的是提高数据库连接的重用性和性能。在传统的数据库连接方式中,每次与数据库建立连接时都需要进行一系列的网络通信和身份验证操作,这样的开销较大并且会影响应用程序的性

    2024年02月06日
    浏览(58)
  • 【100天精通python】Day31:使用python操作数据库_数据库编程接口,连接对象和游标对象,数据库连接配置

    目录  专栏导读  一、数据库编程接口 1. Python标准库接口 2. MySQL Connector/Python接口

    2024年02月13日
    浏览(48)
  • Android studio 连接SQLite数据库 +创建数据库+创建数据库表

    Android studio 之数据库的使用 连接创建SQLite 大家好,欢迎来到寒依。 相信看啦我的教程 当老师问你在学习Android studio 数据库使用过程中遇到什么困难,分享一下你的感悟和解决方法 的时候,你可以直接大胆的说出来: “老师我没有遇到问题,看啦寒依的教程 畅行无阻” 我

    2024年02月02日
    浏览(52)
  • DBeaver连接华为高斯数据库 DBeaver连接Gaussdb数据库 DBeaver connect Gaussdb

              华为GaussDB出来已经有一段时间,最近工作中刚到Gauss数据库。作为coder,那么如何通过可视化工具来操作Gauss呢? 本文将记录使用 免费、开源的DBeaver 来连接Gauss 高斯数据库。         1、安装Gauss数据库         已经安装好的Gauss数据库服务。参考地址:

    2024年02月16日
    浏览(43)
  • 通过JDBC连接数据库并用Java把数据写入数据库

    目录 1.新建项目 2.在src包下新建lib包,用来存放jar包(下载对应jar包复制到lib包里) 3.右键导入的jar包,找到并单击\\\"添加到库\\\"(add....) 4.在src包下新建bean包,新建class类 5.class类中写数据库表中对应的列名的set get方法、空参、有参(String方法)注意:类名为私有类(private),新建类时数

    2024年02月02日
    浏览(65)
  • C#控制台连接Mysql数据库,有配置数据库连接字符串的配置文件

    实现功能 读取. .txt 中的配置文件,来初始化连接字符串 让连接字符串的配置文件不存在会主动创建默认的连接字符串 注意点: 需要引用Newtonsoft 使用mysql

    2024年02月10日
    浏览(54)
  • MySQL数据库,JDBC连接数据库操作流程详细介绍

    在学完 MySQL 和 Java 后,我们通常会尝试使用 Java编译器 连接 MySQL数据库,从而达到使用编译器来操作数据库的效果。连接的这个过程会用 JDBC 相关知识,因此我把 JDBC 包的下载及导入流程,以及 JDBC 的使用流程整理下来分享给大家。 目录 1. 啥是JDBC? 2. JDBC依赖包 2.1 依赖包

    2024年02月06日
    浏览(97)
  • 「数据库、数据库连接池、数据源」这些概念你真的理解了吗?

    我学习的过程中,对于连接池和数据源分得不是很清楚,而且我发现有的人将数据库等同于数据源,或者将数据源等同于连接池,实际上这些说法并不准确。 在某次工作中,同事 A 说道,这个数据源不行,那么换一个数据源就可以了,结果我看他操作,原来是改写了配置中的

    2023年04月21日
    浏览(62)
  • 【Navicat】怎么在Navicat新建连接、新建数据库、导入数据库

    新建一个MySQL连接:打开Navicat,点击“ 左上角第一个图标 -- MySQL ”。 其他的信息都是自动出现的,只需填写 连接名和密码 后点击保存,就新建好了一个连接。 打开新建好的连接:点击“Open Connection”打开连接。 出现绿色说明打开了数据库的连接,然后单击右键。 新建数

    2023年04月27日
    浏览(81)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包