编程 如何使用Rust和sqlx构建一个简单的用户管理系统,支持用户的增删改查功能,并实现操作日志记录。

2024-11-19 03:57:17 +0800 CST views 593

Rust 与 sqlx:构建用户管理系统实战指南

引言

在现代软件开发中,构建一个高效且功能齐全的用户管理系统是常见的需求。Rust,以其卓越的性能和安全性,结合 sqlx 库的强大功能,为开发者提供了处理数据库操作的理想工具。本文将深入探讨如何使用 Rust 和 sqlx 构建一个简单的用户管理系统,并通过详细的示例代码展示每一步的操作。

10. 实践项目:用户管理系统

我们将构建一个简单的用户管理系统,支持用户的增删改查功能。以下是示例代码。

环境准备

确保你已经安装了 Rust 工具链和 MySQL 数据库,并在 Cargo.toml 中添加了必要的依赖:

[dependencies]
sqlx = { version = "0.6", features = ["mysql"] }
tokio = { version = "1", features = ["full"] }
dotenv = "0.15"

配置环境变量

在项目根目录下创建一个 .env 文件,并添加数据库连接字符串:

DATABASE_URL=mysql://root:your_password@localhost/rust_sqlx_example

编写代码

src/main.rs 文件中编写以下代码:

use sqlx::mysql::MySqlPool;
use dotenv::dotenv;
use std::env;

#[derive(Debug, sqlx::FromRow)]
struct User {
    id: i32,
    name: String,
    email: String,
}

#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
    // 加载环境变量
    dotenv().ok();

    // 获取数据库连接URL
    let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");

    // 初始化数据库连接池
    let pool = MySqlPool::connect(&database_url).await?;

    // 创建用户
    let user = User {
        id: 0,
        name: "Alice".to_string(),
        email: "alice@example.com".to_string(),
    };
    let result = sqlx::query!(
        "INSERT INTO users (name, email) VALUES (?, ?)",
        user.name,
        user.email
    )
    .execute(&pool)
    .await?;
    println!("Inserted user with id: {}", result.last_insert_id());

    // 查询用户
    let users = sqlx::query_as!(User, "SELECT id, name, email FROM users")
        .fetch_all(&pool)
        .await?;
    for user in users {
        println!("User: {:?}", user);
    }

    // 更新用户
    let result = sqlx::query!(
        "UPDATE users SET email = ? WHERE id = ?",
        "alice_new@example.com",
        1
    )
    .execute(&pool)
    .await?;
    println!("Updated {} rows", result.rows_affected());

    // 删除用户
    let result = sqlx::query!("DELETE FROM users WHERE id = ?", 1)
        .execute(&pool)
        .await?;
    println!("Deleted {} rows", result.rows_affected());

    Ok(())
}

日志记录

我们可以将操作日志记录到数据库中,模拟实际开发中的常见场景。以下是示例代码:

创建日志表

首先,创建一个日志表:

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    action VARCHAR(255) NOT NULL,
    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

编写代码

src/main.rs 文件中添加日志记录功能:

use sqlx::mysql::MySqlPool;
use dotenv::dotenv;
use std::env;

#[derive(Debug, sqlx::FromRow)]
struct User {
    id: i32,
    name: String,
    email: String,
}

#[derive(Debug, sqlx::FromRow)]
struct Log {
    id: i32,
    action: String,
    timestamp: chrono::NaiveDateTime,
}

async fn log_action(pool: &MySqlPool, action: &str) -> Result<(), sqlx::Error> {
    sqlx::query!(
        "INSERT INTO logs (action) VALUES (?)",
        action
    )
    .execute(pool)
    .await?;
    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
    // 加载环境变量
    dotenv().ok();

    // 获取数据库连接URL
    let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");

    // 初始化数据库连接池
    let pool = MySqlPool::connect(&database_url).await?;

    // 创建用户
    let user = User {
        id: 0,
        name: "Alice".to_string(),
        email: "alice@example.com".to_string(),
    };
    let result = sqlx::query!(
        "INSERT INTO users (name, email) VALUES (?, ?)",
        user.name,
        user.email
    )
    .execute(&pool)
    .await?;
    println!("Inserted user with id: {}", result.last_insert_id());
    log_action(&pool, "create_user").await?;

    // 查询用户
    let users = sqlx::query_as!(User, "SELECT id, name, email FROM users")
        .fetch_all(&pool)
        .await?;
    for user in users {
        println!("User: {:?}", user);
    }
    log_action(&pool, "query_users").await?;

    // 更新用户
    let result = sqlx::query!(
        "UPDATE users SET email = ? WHERE id = ?",
        "alice_new@example.com",
        1
    )
    .execute(&pool)
    .await?;
    println!("Updated {} rows", result.rows_affected());
    log_action(&pool, "update_user").await?;

    // 删除用户
    let result = sqlx::query!("DELETE FROM users WHERE id = ?", 1)
        .execute(&pool)
        .await?;
    println!("Deleted {} rows", result.rows_affected());
    log_action(&pool, "delete_user").await?;

    // 查询日志
    let logs = sqlx::query_as!(Log, "SELECT id, action, timestamp FROM logs")
        .fetch_all(&pool)
        .await?;
    for log in logs {
        println!("Log: {:?}", log);
    }

    Ok(())
}

运行代码

确保数据库已配置并启动,运行代码后将看到插入用户、更新、删除以及操作日志的输出。

总结

通过本文的介绍和示例代码,我们深入了解了如何使用 Rust 和 sqlx 构建一个简单的用户管理系统,并实现日志记录功能。从创建用户到查询、更新和删除用户,再到记录操作日志,每一步都通过详细的代码示例进行了展示。通过结合 Rust 的强大能力和 sqlx 的高效数据库操作,开发者可以构建出高性能、安全且可靠的数据库应用。希望本文能为你在 Rust 和 sqlx 的学习和应用之路上提供有益的指导和启发。

复制全文 生成海报 Rust 数据库 软件开发 用户管理 编程

推荐文章

liunx服务器监控workerman进程守护
2024-11-18 13:28:44 +0800 CST
imap_open绕过exec禁用的脚本
2024-11-17 05:01:58 +0800 CST
CSS 中的 `scrollbar-width` 属性
2024-11-19 01:32:55 +0800 CST
IP地址获取函数
2024-11-19 00:03:29 +0800 CST
JavaScript中设置器和获取器
2024-11-17 19:54:27 +0800 CST
XSS攻击是什么?
2024-11-19 02:10:07 +0800 CST
Mysql允许外网访问详细流程
2024-11-17 05:03:26 +0800 CST
Go中使用依赖注入的实用技巧
2024-11-19 00:24:20 +0800 CST
CSS 特效与资源推荐
2024-11-19 00:43:31 +0800 CST
Vue中的`key`属性有什么作用?
2024-11-17 11:49:45 +0800 CST
智能视频墙
2025-02-22 11:21:29 +0800 CST
PyMySQL - Python中非常有用的库
2024-11-18 14:43:28 +0800 CST
程序员茄子在线接单