Skip to content

sqlx增删改查

sqlx 是一个用于 Rust 语言的异步数据库访问库,它提供了简洁、安全且高效的方式来与多种数据库进行交互,包括 MySQLPostgreSQLSQLite

主要特点

  1. 异步操作sqlx 基于 Rust 的异步编程模型,允许在不阻塞主线程的情况下执行数据库操作,从而提高应用程序的整体性能和响应能力。
  2. 类型安全:通过 Rust 的类型系统,sqlx 确保数据库查询和数据处理的类型安全性,减少运行时错误。
  3. 编译时检查sqlx 支持编译时 SQL 语句检查,能够在编译阶段发现 SQL 语法错误,而不是在运行时。
  4. 多种数据库支持:支持多种流行的数据库,使得开发者可以根据项目需求选择合适的数据库系统。

使用

toml
//Cargo.toml
[package]
name = "read_mysql"
version = "0.1.0"
edition = "2021"

[dependencies]
sqlx = { version = "0.8.3", features = ["runtime-tokio-native-tls", "mysql"] }
tokio = { version = "1", features = ["full"] }
rust
use sqlx::mysql::MySqlPool;
use sqlx::{FromRow, MySql};
use tokio;

#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
    // 创建数据库连接池
    let pool = MySqlPool::connect("mysql://[用户名称]:[密码]@localhost:3306/[数据库名称]").await?;
    Ok(())
}

rust
use sqlx::mysql::MySqlPool;
use sqlx::{FromRow, MySql};
use tokio;

#[derive(Debug)]
struct NewUser {
    name: String,
    email: Option<String>,
    phone: Option<String>,
    photo: Option<String>,
}

#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
    // 创建数据库连接池
    let pool = MySqlPool::connect("mysql://[用户名称]:[密码]@localhost:3306/[数据库名称]").await?;
    //新增用户
    let new_user = NewUser {
        name: "新增用户".to_string(),
        email: Some("[email protected]".to_string()),
        photo: None,
        phone: Some("1234567890".to_string()),
    };
    sqlx::query("INSERT INTO user_list (name, email, phone, photo) VALUES (?, ?, ?, ?)")
        .bind(&new_user.name)
        .bind(&new_user.email)
        .bind(&new_user.phone)
        .bind(&new_user.photo)
        .execute(&pool)
        .await?;

    Ok(())
}

rust
use sqlx::mysql::MySqlPool;
use sqlx::{FromRow, MySql};
use tokio;
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
    // 创建数据库连接池
    let pool = MySqlPool::connect("mysql://[用户名称]:[密码]@localhost:3306/[数据库名称]").await?;
    // 删除id为3的用户
    sqlx::query("DELETE FROM user_list WHERE id = ?")
        .bind(3)
        .execute(&pool)
        .await?;
    Ok(())
}

rust
use sqlx::mysql::MySqlPool;
use sqlx::{FromRow, MySql};
use tokio;

#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
    // 创建数据库连接池
    let pool = MySqlPool::connect("mysql://[用户名称]:[密码]@localhost:3306/[数据库名称]").await?;
    // 修改id为4的用户name为'更新用户'
    sqlx::query("UPDATE user_list SET name = ? WHERE id = ?")
        .bind("更新用户")
        .bind(4)
        .execute(&pool)
        .await?;
    Ok(())
}

rust
use sqlx::mysql::MySqlPool;
use sqlx::{FromRow, MySql};
use tokio;

#[derive(Debug, FromRow)]
struct User {
    id: i32,
    name: String,
    email: Option<String>,
    phone: Option<String>,
    photo: Option<String>,
}
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
    // 创建数据库连接池
    let pool = MySqlPool::connect("mysql://[用户名称]:[密码]@localhost:3306/[数据库名称]").await?;
    // 查询
    let rows = sqlx::query_as::<_, User>("SELECT * FROM user_list")
        .fetch_all(&pool)
        .await?;
    //关联查询
	// let rows = sqlx::query_as::<_, User>(
    //     "SELECT * FROM `user_list` LEFT JOIN user_type ON user_list.user_type = user_type.id",
    // )
    // .fetch_all(&pool)
    // .await?;
    // 处理查询结果
    for row in rows {
        /* 打印获取的数据库整行信息 */
        println!("{:?}", row);
    }
    Ok(())
}

事务

在数据库操作中,事务是一组逻辑上相关的操作,这些操作要么全部成功,要么全部失败。sqlx 库提供了对事务的支持,允许你在 Rust 中进行可靠的数据库事务操作。

rust
use sqlx::mysql::{MySql, MySqlPool, MySqlPoolOptions};
use sqlx::FromRow;
use tokio;

#[derive(Debug, FromRow)]
struct User {
    id: i32,
    name: String,
    email: Option<String>,
    phone: Option<String>,
    photo: Option<String>,
}
#[derive(Debug)]
struct NewUser {
    name: String,
    email: Option<String>,
    phone: Option<String>,
    photo: Option<String>,
}

#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
    // 创建数据库连接池
    let pool = MySqlPool::connect("mysql://[用户名称]:[密码]@localhost:3306/[数据库名称]").await?;
    let mut tx = pool.begin().await?;//开始事务

    sqlx::query("UPDATE user_list SET name = ? WHERE id = ?")
        .bind("更新用户")
        .bind(5)
        .execute(&mut *tx)
        .await?;
    sqlx::query("UPDATE user_list SET name = ? WHERE id = ?")
        .bind("更新用户")
        .bind("aaa")
        .execute(&mut *tx)
        .await?;

    tx.commit().await?;

    // sqlx::query("UPDATE user_list SET name = ? WHERE id = ?")
    //     .bind("更新用户1")
    //     .bind(5)
    //     .execute(&pool)
    //     .await?;
    // sqlx::query("UPDATE user_list SET name = ? WHERE id = ?")
    //     .bind("更新用户2")
    //     .bind("aaa")
    //     .execute(&pool)
    //     .await?;

    Ok(())
}