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