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

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

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 数据库 软件开发 用户管理 编程

推荐文章

使用Vue 3实现无刷新数据加载
2024-11-18 17:48:20 +0800 CST
页面不存在404
2024-11-19 02:13:01 +0800 CST
html一份退出酒场的告知书
2024-11-18 18:14:45 +0800 CST
跟着 IP 地址,我能找到你家不?
2024-11-18 12:12:54 +0800 CST
前端如何一次性渲染十万条数据?
2024-11-19 05:08:27 +0800 CST
在 Vue 3 中如何创建和使用插件?
2024-11-18 13:42:12 +0800 CST
Vue3中如何处理WebSocket通信?
2024-11-19 09:50:58 +0800 CST
如何在Vue中处理动态路由?
2024-11-19 06:09:50 +0800 CST
如何开发易支付插件功能
2024-11-19 08:36:25 +0800 CST
php使用文件锁解决少量并发问题
2024-11-17 05:07:57 +0800 CST
阿里云免sdk发送短信代码
2025-01-01 12:22:14 +0800 CST
Vue3中的组件通信方式有哪些?
2024-11-17 04:17:57 +0800 CST
Vue3中如何实现国际化(i18n)?
2024-11-19 06:35:21 +0800 CST
15 个 JavaScript 性能优化技巧
2024-11-19 07:52:10 +0800 CST
Vue3 结合 Driver.js 实现新手指引
2024-11-18 19:30:14 +0800 CST
CSS 奇技淫巧
2024-11-19 08:34:21 +0800 CST
如何使用go-redis库与Redis数据库
2024-11-17 04:52:02 +0800 CST
Vue3中如何实现状态管理?
2024-11-19 09:40:30 +0800 CST
rangeSlider进度条滑块
2024-11-19 06:49:50 +0800 CST
MySQL用命令行复制表的方法
2024-11-17 05:03:46 +0800 CST
程序员茄子在线接单