sqlx执行案例

SQLx简介

SQLx是Rust语言中的一个异步SQL数据库连接库,它支持多种数据库,如PostgreSQL、MySQL和SQLite。SQLx提供了简单的API和异步执行查询的能力,使得Rust程序员可以轻松地与数据库交互1

本章节以PostgreSQL为例。

目录结构

cargo.toml配置文件

复制代码
[package]
name = "rust_model"
version = "0.1.0"
edition = "2021"

[dependencies]
tokio = {version = "1.37.0",features = ["full"]}
sqlx = { version = "0.7.4",features = ["postgres", "runtime-tokio-rustls","macros","chrono"]}
dotenv = {version = "0.15.0"}
chrono={version = "0.4.38", features = ["serde"]}
serde={version = "1.0.200", features = ["derive"]}
actix-web = "4.0.4"
actix-rt = "2.9.0"

[[example]]
name = "rustSQLx"
path = "examples/SQL/rustSQLx.rs"
doc-scrape-examples = true

[package.metadata.example.rustSQLx]
name = "Create SQL Database"
description = "demonstrates SQLx database create"
category = "SQL Rendering"
wasm = true

.env环境变量配置文件

复制代码
DATABASE_URL=postgres://postgres:123456@127.0.0.1:5432/library

假设已有数据库library,创建表

复制代码
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);

rustSQLx.rs执行文件

复制代码
use chrono::NaiveDate;
use dotenv::dotenv;
use sqlx::postgres::PgPoolOptions;
use std::env;
use rand::Rng;

#[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> {

    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 mut rng = rand::thread_rng();
    println!("Random i32: {}", rng.gen::<i32>());
    let upc = Course{
        id: rng.gen::<i64>(),
        teacher_id: rng.gen::<i32>(),
        name: "YinThunder".to_string(),
        time: None,
    };

    // 增加
    let insert = sqlx::query!(
        r#"INSERT INTO course VALUES ($1, $2, $3)"#,
        upc.id as i32,
        upc.teacher_id,
        upc.name
    )
        .fetch_all(&pool)
        .await?;
    // 更新
    let update = sqlx::query!(r#"UPDATE course SET name=$1 WHERE id = $2"#, "Amy",1)
        .fetch_all(&pool)
        .await?;

    //删除
    let delete = sqlx::query!(r#"DELETE FROM course WHERE id = $1"#, 2)
        .fetch_all(&pool)
        .await?;

    Ok(())
}

命令行执行

复制代码
cargo run --example rustSQLx
相关推荐
武昌库里写JAVA12 小时前
在iview中使用upload组件上传文件之前先做其他的处理
java·vue.js·spring boot·后端·sql
钱彬 (Qian Bin)12 小时前
项目实践13—全球证件智能识别系统(内网离线部署大模型并调用)
数据库·postgresql·fastapi·ubuntu24.04·离线部署·qwen3大模型
尋有緣12 小时前
力扣614-二级关注者
大数据·数据库·sql·oracle
l1t13 小时前
在postgres和duckdb中比较两个数组并只挑选不匹配的元素
数据库·sql·postgresql·数组·duckdb
宁小法14 小时前
SQL查询对比: select exists($sql) 跟 select * from `users` where `id` = 60000001的区别差异
数据库·sql·select exists
不剪发的Tony老师16 小时前
sqlectron:一款轻量级的SQL客户端
数据库·sql
几度风雨见丹心19 小时前
sqlite图形化界面建数据库、建表、增删改查、选择.db文件、将sql脚本一键导入,并同步数据、一键导出sql脚本并保存本地.sql文件
数据库·sql·sqlite
Hello.Reader19 小时前
Flink Procedures 用 SQL 的 `CALL` 跑 Flink Job(实现、类型推断、命名参数、Catalog 集成一篇搞懂)
大数据·sql·flink
刘冲溟19 小时前
解决 idea 编辑sql文件换行后自动缩进的问题
sql·idea·缩进
是阿威啊19 小时前
企业级的RDD、 Spark SQL、DataFrame、Dataset使用场景介绍
大数据·sql·spark