使用sqlx与数据库交流
一、依赖添加
1 |
|
chrono
:处理日期类型字段,提供NaiveDateTime
和DateTime<Utc>
,其中NaiveDateTime
不包含时区信息,对应数据库的DATETIME
类型,DateTime<Utc>
包含UTC
时区信息,对应数据库TIMESTAMP
类型;chrono
默认未实现serde
的Serialize
,需要启用serde feature
支持。serde
和serde_json
:用于处理数据的序列化。sqlx
: 用于与数据库交付的核心crate
tokio
: 异步运行crate
二、操作示例
1、创建连接池
1 |
|
2、数据插入
1 |
|
bind
用于变量绑定替换,在MySQL
中使用?
作为变量占位符execute
用于sql
执行NaiveDateTime::parse_from_str
用于将字符串格式日期转为NaiveDateTime
,常用的格式:%Y
:四位年份%m
:两位月份%d
:两位日期%H
:24 小时制的小时%M
:分钟%S
:秒
3、数据查询并映射到 serde_json.Value
1 |
|
4、使用 query_as 将结果映射到struct
query_as
函数运行时解析 SQL 语句,适合动态生成的查询,但没有编译时的类型安全检查
struct
需要通过sqlx::FromRow
进行类型转换1
2
3
4
5
6
7
8#[derive(Debug, FromRow)]
struct Student {
id: i64,
name: String,
age: i8,
birthday: NaiveDateTime,
create_date: Option<DateTime<Utc>>,
}使用
sqlx::query_as::<struct, _>()
指定需要解析的类型1
2
3
4
5
6// 将结果映射到 struct
let select_one_sql = "select * from student where id = ?";
let student: Student = sqlx::query_as::<_, Student>(select_one_sql)
.bind(1) // 使用 bind 来绑定查询参数
.fetch_one(&pool)
.await?;
5、使用query_as!宏将结果映射到struct
query_as!
宏会在编译时检查 SQL
语句的正确性,要求 SQL
是静态字符串,确保类型匹配,另外query_as!
宏不要求struct
通过sqlx::FromRow
进行类型转换
1 |
|
错误提示:
expected string literal
:SQL
语句不是直接的字符串,而是通过变量等形式引用,无法在编译期确定error: set DATABASE_URL to use query macros online, or run cargo sqlx prepare to update the query cache
:在根目录下创建.env
文件并添加DATABASE_URL
环境变量可以解决问题
三、参考
使用sqlx与数据库交流
https://probiecoder.cn/rust/sqlx.html