一、创建Rust Axum项目
二、添加sqlx依赖
- 使用配置文件添加依赖
在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"] }
- 使用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的错误处理
-
设置模块
- 打开
/lib/mod.rs
文件写入以下内容
pub mod store;
- 打开
/lib/store/mod.rs
写入以下内容
pub mod sqlite;
- 打开
-
打开
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();
-
修改
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())
}