Rust Axum前后端分离项目-使用sqlx连接数据库


一、创建Rust Axum项目

详见新建Rust Axum项目


二、添加sqlx依赖

  1. 使用配置文件添加依赖
    在Cargo.toml中添加以下内容
[dependencies]
# sqlite
sqlx = { version = "0.7", features = [ "runtime-tokio", "tls-rustls", "sqlite"] }
# mysql
sqlx =  { version = "0.7", features = [ "runtime-tokio", "tls-rustls", "mysql"] }
# postgres
sqlx =  { version = "0.7", features = [ "runtime-tokio", "tls-rustls", "postgres"] }
  1. 使用shell命令添加依赖
# sqlite
cargo add sqlx --features runtime-tokio,tls-rustls,sqlite
#  mysql
cargo add sqlx --features runtime-tokio,tls-rustls,mysql
# postgres
cargo add sqlx --features runtime-tokio,tls-rustls,postgres

三、创建应用目录

src
   ├─ lib
   │  ├─ mod.rs
   │  └─ store
   │	 ├─ sqlite.rs // sqlite连接文件
   │     └─ mod.rs
   └─ main.rs

四、 连接数据库

MySQL和Postgres暂未做错误处理,只做了Sqlite的错误处理

  1. 设置模块

    • 打开/lib/mod.rs文件写入以下内容
    pub mod store;
    
    • 打开/lib/store/mod.rs写入以下内容
    pub mod sqlite;
    
  2. 打开sqlite.rs文件

    1. 使用Sqlite数据库
    use sqlx::{sqlite::SqlitePoolOptions, Pool, Sqlite};
    use tracing::info;
    
    pub async fn init_database() -> Pool<Sqlite> {
       match SqlitePoolOptions::new().connect("sqlite:data.db").await {
           Ok(pool) => {
               info!("数据库连接成功");
               pool
           }
           Err(_) => {
               info!("未找到数据库文件, 创建数据库文件并连接");
               // 创建数据库文件
               std::fs::File::create("./data.db").unwrap();
               let pool = SqlitePoolOptions::new()
                   .connect("sqlite:data.db")
                   .await
                   .unwrap();
               info!("数据库连接成功");
               pool
           }
       }
    }
    
    2.使用Mysql数据库
    MysqlPoolOptions::new()
           .connect("mysql://user:password@host/database")
           .await.unwrap();
    
    3.使用Postgres
    MysqlPoolOptions::new()
           .connect("postgres://user:password@host/database")
           .await.unwrap();
    
  3. 修改main.rs文件

use crate::lib::store::sqlite;
use axum::{response::Html, routing::get, Router};
use tower_http::trace::TraceLayer;
use tracing::info;

mod lib;

#[tokio::main]
async fn main() {
   // 初始化日志输出
   tracing_subscriber::fmt::init();
   let pool = sqlite::init_database().await;
   // 初始化路由
   let app = Router::new()
       .route("/hello", get(get_str))
       // 配置日志中间件
       .layer(TraceLayer::new_for_http())
       // 把数据库连接池保存到axum的状态中
       .with_state(pool);
   // 监听tcp端口
   let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await.unwrap();
   info!("服务器启动在:{}", listener.local_addr().unwrap());
   // 启动axum服务
   axum::serve(listener, app).await.unwrap();
}

async fn get_str() -> Html<&'static str> {
   Html("<h1>Hello World</h1>".into())
}
  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要在你的 Rust 项目中添加 sqlx 和 sqlx-core 依赖,可以在 Cargo.toml 文件中添加如下内容: ```toml [dependencies] sqlx = "0.5" sqlx-core = "0.5" ``` 接下来,你需要定义一个数据模型来表示数据库中的表。例如,考虑一个简单的用户表,包含 id、name 和 email 字段,你可以创建一个名为 User 的结构体来表示它: ```rust use sqlx::{FromRow, PgPool}; #[derive(Debug, FromRow)] struct User { id: i32, name: String, email: String, } ``` 接着,你需要创建一个 PostgreSQL 连接池,以便从数据库中查询数据。你可以使用 `PgPool::connect` 方法来创建连接池: ```rust #[tokio::main] async fn main() -> Result<(), sqlx::Error> { let pool = PgPool::connect("postgres://user:password@host/database").await?; // ... Ok(()) } ``` 现在,你可以使用 sqlx 的查询宏来查询用户表中的数据。例如,要查询所有用户的名称和电子邮件,可以使用如下代码: ```rust let users = sqlx::query_as::<_, User>("SELECT id, name, email FROM users") .fetch_all(&pool) .await?; ``` 这将返回一个包含所有用户的名称和电子邮件的 vector。如果你只想查询特定用户的数据,可以使用参数化查询: ```rust let user = sqlx::query_as::<_, User>("SELECT id, name, email FROM users WHERE id = $1") .bind(1) .fetch_one(&pool) .await?; ``` 这将返回 ID 为 1 的用户的名称和电子邮件。 当然,这只是一个简单的示例。使用 sqlx 还有很多更复杂的查询和操作,你可以参考 sqlx 的文档来学习更多内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值