sqlx
增删改查
sqlx
是一个用于 Rust 语言的异步数据库访问库,它提供了简洁、安全且高效的方式来与多种数据库进行交互,包括MySQL
、PostgreSQL
和SQLite
等主要特点
- 异步操作:
sqlx
基于 Rust 的异步编程模型,允许在不阻塞主线程的情况下执行数据库操作,从而提高应用程序的整体性能和响应能力。- 类型安全:通过 Rust 的类型系统,
sqlx
确保数据库查询和数据处理的类型安全性,减少运行时错误。- 编译时检查:
sqlx
支持编译时SQL
语句检查,能够在编译阶段发现SQL
语法错误,而不是在运行时。- 多种数据库支持:支持多种流行的数据库,使得开发者可以根据项目需求选择合适的数据库系统。
使用
toml
//Cargo.toml
[package]
name = "read_mysql"
version = "0.1.0"
edition = "2021"
[dependencies]
sqlx = { version = "0.8.3", features = ["runtime-tokio-native-tls", "mysql"] }
tokio = { version = "1", features = ["full"] }
rust
use sqlx::mysql::MySqlPool;
use sqlx::{FromRow, MySql};
use tokio;
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
// 创建数据库连接池
let pool = MySqlPool::connect("mysql://[用户名称]:[密码]@localhost:3306/[数据库名称]").await?;
Ok(())
}
增
rust
use sqlx::mysql::MySqlPool;
use sqlx::{FromRow, MySql};
use tokio;
#[derive(Debug)]
struct NewUser {
name: String,
email: Option<String>,
phone: Option<String>,
photo: Option<String>,
}
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
// 创建数据库连接池
let pool = MySqlPool::connect("mysql://[用户名称]:[密码]@localhost:3306/[数据库名称]").await?;
//新增用户
let new_user = NewUser {
name: "新增用户".to_string(),
email: Some("[email protected]".to_string()),
photo: None,
phone: Some("1234567890".to_string()),
};
sqlx::query("INSERT INTO user_list (name, email, phone, photo) VALUES (?, ?, ?, ?)")
.bind(&new_user.name)
.bind(&new_user.email)
.bind(&new_user.phone)
.bind(&new_user.photo)
.execute(&pool)
.await?;
Ok(())
}
删
rust
use sqlx::mysql::MySqlPool;
use sqlx::{FromRow, MySql};
use tokio;
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
// 创建数据库连接池
let pool = MySqlPool::connect("mysql://[用户名称]:[密码]@localhost:3306/[数据库名称]").await?;
// 删除id为3的用户
sqlx::query("DELETE FROM user_list WHERE id = ?")
.bind(3)
.execute(&pool)
.await?;
Ok(())
}
改
rust
use sqlx::mysql::MySqlPool;
use sqlx::{FromRow, MySql};
use tokio;
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
// 创建数据库连接池
let pool = MySqlPool::connect("mysql://[用户名称]:[密码]@localhost:3306/[数据库名称]").await?;
// 修改id为4的用户name为'更新用户'
sqlx::query("UPDATE user_list SET name = ? WHERE id = ?")
.bind("更新用户")
.bind(4)
.execute(&pool)
.await?;
Ok(())
}
查
rust
use sqlx::mysql::MySqlPool;
use sqlx::{FromRow, MySql};
use tokio;
#[derive(Debug, FromRow)]
struct User {
id: i32,
name: String,
email: Option<String>,
phone: Option<String>,
photo: Option<String>,
}
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
// 创建数据库连接池
let pool = MySqlPool::connect("mysql://[用户名称]:[密码]@localhost:3306/[数据库名称]").await?;
// 查询
let rows = sqlx::query_as::<_, User>("SELECT * FROM user_list")
.fetch_all(&pool)
.await?;
//关联查询
// let rows = sqlx::query_as::<_, User>(
// "SELECT * FROM `user_list` LEFT JOIN user_type ON user_list.user_type = user_type.id",
// )
// .fetch_all(&pool)
// .await?;
// 处理查询结果
for row in rows {
/* 打印获取的数据库整行信息 */
println!("{:?}", row);
}
Ok(())
}
事务
在数据库操作中,事务是一组逻辑上相关的操作,这些操作要么全部成功,要么全部失败。
sqlx
库提供了对事务的支持,允许你在 Rust 中进行可靠的数据库事务操作。
rust
use sqlx::mysql::{MySql, MySqlPool, MySqlPoolOptions};
use sqlx::FromRow;
use tokio;
#[derive(Debug, FromRow)]
struct User {
id: i32,
name: String,
email: Option<String>,
phone: Option<String>,
photo: Option<String>,
}
#[derive(Debug)]
struct NewUser {
name: String,
email: Option<String>,
phone: Option<String>,
photo: Option<String>,
}
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
// 创建数据库连接池
let pool = MySqlPool::connect("mysql://[用户名称]:[密码]@localhost:3306/[数据库名称]").await?;
let mut tx = pool.begin().await?;//开始事务
sqlx::query("UPDATE user_list SET name = ? WHERE id = ?")
.bind("更新用户")
.bind(5)
.execute(&mut *tx)
.await?;
sqlx::query("UPDATE user_list SET name = ? WHERE id = ?")
.bind("更新用户")
.bind("aaa")
.execute(&mut *tx)
.await?;
tx.commit().await?;
// sqlx::query("UPDATE user_list SET name = ? WHERE id = ?")
// .bind("更新用户1")
// .bind(5)
// .execute(&pool)
// .await?;
// sqlx::query("UPDATE user_list SET name = ? WHERE id = ?")
// .bind("更新用户2")
// .bind("aaa")
// .execute(&pool)
// .await?;
Ok(())
}