文章

rust 实现简单diesel mysql增删改查

Cargo.toml

[package]  
name = "clipboard"  
version = "0.1.0"  
edition = "2021"  
  
[dependencies]  
diesel = { version = "2.2.0", features = ["mysql","chrono"] }  
dotenvy = "0.15"  
chrono = "0.4"

main.rs

pub mod schema;  
pub mod models;  
  
use diesel::prelude::*;  
use dotenvy::dotenv;  
use std::env;  
use crate::schema::users::dsl::users;  
  
  
/// 建立与MySQL数据库的连接  
///  
/// 该函数从环境变量中读取数据库URL,并使用该URL建立数据库连接  
/// 如果环境变量中未设置DATABASE_URL,或者无法使用该URL建立连接,函数将panic  
///  
/// # Returns  
/// 返回一个与MySQL数据库建立的连接实例  
pub fn establish_connection() -> MysqlConnection {  
    // 加载环境变量文件  
    dotenv().ok();  
  
    // 从环境变量中读取数据库URL,如果未设置,则引发panic  
    let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");  
  
    // 使用读取到的数据库URL建立数据库连接,如果连接失败,则引发panic  
    MysqlConnection::establish(&database_url)  
        .unwrap_or_else(|_| panic!("Error connecting to {}", database_url))  
}  
  
  
/// 查询指定用户名的用户信息  
///  
/// # Arguments  
///  
/// * `conn` - 一个 mutable 的 MySQL 连接对象,用于数据库操作  
fn query_user(conn: &mut MysqlConnection) {  
    // 使用用户名 "qwe" 查询 users 表中的用户信息  
    let results = users.select(models::User::as_select()).load(conn).expect("获取失败");  
  
    // 打印查询到的用户数量  
    println!("users count:{}", results.len());  
  
    // 遍历查询结果并打印每个用户的用户名  
    for user in results {  
        println!("username:{}", user.username)  
    }  
}  
  
  
/// 在数据库中创建新用户  
///  
/// # Arguments  
/// * `conn` - 一个可变的MySQL连接引用,用于与数据库通信  
///  
/// # Returns  
/// * `bool` - 如果用户成功创建,则返回true;否则返回false  
fn create_user(conn: &mut MysqlConnection) -> bool {  
    // 创建一个新用户实例  
    let new_user = models::NewUser {  
        username: "qwe".to_string(),  
        password: "123".to_string(),  
        email: "qqq".to_string(),  
    };  
  
    // 将新用户插入到数据库中,并处理结果  
    // 如果插入成功,is_ok()将返回true,否则返回false  
    diesel::insert_into(users).values(&new_user).execute(conn).is_ok()  
}  
  
  
/// 更新数据库中的用户信息  
///  
/// 此函数尝试更新电子邮件地址为"qqq"的用户的用户名为"update"。  
/// 它使用Diesel ORM与数据库进行交互,特别是针对MySQL数据库连接。  
///  
/// # Parameters  
///  
/// * `conn`: &mut MysqlConnection - 一个可变的数据库连接引用,用于执行数据库操作。  
///  
/// # Returns  
///  
/// * `bool` - 返回一个布尔值,指示更新操作是否成功。`true`表示成功,`false`表示失败。  
fn update_user(conn: &mut MysqlConnection) -> bool {  
    // 引入users表的dsl模块中的所有内容,以便直接引用表和字段  
    use crate::schema::users::dsl::*;  
  
    // 执行更新操作并检查结果。这个操作会更新所有电子邮件地址为"qqq"的用户的用户名为"update"。  
    // 最后,使用is_ok()方法检查执行结果是否成功,成功则返回true,否则返回false。  
    diesel::update(users).filter(email.eq("qqq")).set(username.eq("update")).execute(conn).is_ok()  
}  
  
/// 删除指定user  
fn delete_user(conn: &mut MysqlConnection) -> bool {  
    // 引入users表的dsl模块中的所有内容,以便直接引用表和字段  
    use crate::schema::users::dsl::*;  
  
    // 执行删除操作并检查结果。这个操作会删除所有电子邮件地址为"qqq"的用户。  
    // 最后,使用is_ok()方法检查执行结果是否成功,成功则返回true,否则返回false。  
    diesel::delete(users).filter(email.eq("qqq")).execute(conn).is_ok()  
}  
  
  
fn main() {  
    let conn = &mut establish_connection();  
    println!("create user success:{}", create_user(conn));  
    println!("update user success:{}", update_user(conn));  
    query_user(conn);  
    println!("delete user success:{}", delete_user(conn))  
}

models.rs

use diesel::prelude::*;  
use chrono::NaiveDateTime;  
use crate::schema::users;  
  
#[derive(Queryable, Selectable)]  
#[diesel(table_name = users)]  
#[diesel(check_for_backend(diesel::mysql::Mysql))]  
pub struct User {  
    pub id: u64,  
    #[diesel(column_name = username)]  
    pub username: String,  
    #[diesel(column_name = password)]  
    pub password: String,  
    #[diesel(column_name = email)]  
    pub email: String,  
    pub expiration_time: Option<NaiveDateTime>,  
    pub creation_time: Option<NaiveDateTime>,  
}  
  
  
#[derive(Insertable)]  
#[diesel(table_name = users)]  
pub struct NewUser {  
    #[diesel(column_name = username)]  
    pub username: String,  
    #[diesel(column_name = password)]  
    pub password: String,  
    #[diesel(column_name = email)]  
    pub email: String,  
}

schema.rs

// @generated automatically by Diesel CLI.  
  
diesel::table! {  
    users (id) {  
        id -> Unsigned<Bigint>,  
        #[max_length = 64]  
        username -> Varchar,  
        #[max_length = 32]  
        password -> Char,  
        #[max_length = 256]  
        email -> Varchar,  
        expiration_time -> Nullable<Datetime>,  
        creation_time -> Nullable<Datetime>,  
    }  
}
许可协议:  GPL V3