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

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

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

推荐文章

ElasticSearch简介与安装指南
2024-11-19 02:17:38 +0800 CST
php strpos查找字符串性能对比
2024-11-19 08:15:16 +0800 CST
使用 node-ssh 实现自动化部署
2024-11-18 20:06:21 +0800 CST
Python Invoke:强大的自动化任务库
2024-11-18 14:05:40 +0800 CST
Golang中国地址生成扩展包
2024-11-19 06:01:16 +0800 CST
Go语言中的`Ring`循环链表结构
2024-11-19 00:00:46 +0800 CST
jQuery中向DOM添加元素的多种方法
2024-11-18 23:19:46 +0800 CST
使用 Git 制作升级包
2024-11-19 02:19:48 +0800 CST
Go 单元测试
2024-11-18 19:21:56 +0800 CST
使用 `nohup` 命令的概述及案例
2024-11-18 08:18:36 +0800 CST
Golang 中应该知道的 defer 知识
2024-11-18 13:18:56 +0800 CST
使用Python提取图片中的GPS信息
2024-11-18 13:46:22 +0800 CST
Go 协程上下文切换的代价
2024-11-19 09:32:28 +0800 CST
Nginx 反向代理 Redis 服务
2024-11-19 09:41:21 +0800 CST
快速提升Vue3开发者的效率和界面
2025-05-11 23:37:03 +0800 CST
黑客帝国代码雨效果
2024-11-19 01:49:31 +0800 CST
如何在Rust中使用UUID?
2024-11-19 06:10:59 +0800 CST
PHP 压缩包脚本功能说明
2024-11-19 03:35:29 +0800 CST
服务器购买推荐
2024-11-18 23:48:02 +0800 CST
Rust 并发执行异步操作
2024-11-18 13:32:18 +0800 CST
程序员茄子在线接单