- 支持试读
为什么选择 sqlx 而不是 ORM?
本章我们先讨论一个问题:为什么选择 sqlx 而不是 ORM? - 支持试读
基本CRUD
本章我们将讨论使用 sqlx 和 PostgreSQL 执行基本的 CRUD (增删改查)操作。 Executor
本章我们探讨 sqlx 使用最频繁的 trait:Executor。同时还将讨论如何通过参数传递事务。- 支持试读
使用 sqlx 操作 PostgreSQL 数组
PostgreSQL 原生支持数组。本章将讨论如何使用 sqlx 操作 PostgreSQL 的数组。 把 PostgreSQL 变成 MongoDB
MongoDB 等 NoSQL 异军突起的原因之一就是解决了传统关系型数据库的一大痛点:数据的扩展性,与此同时,NoSQL 又丧失了关系型数据库的范式。PostgreSQL 原生支持 JSON,通过这一特性,可以将 PostgreSQL 打造为同时兼备关系型数据库和 NoSQL 数据库的六边形数据库。把 PostgreSQL 变成 Redis
PostgreSQL 支持 hstore 数据类型:一种简单的键/值对。配合无日志表,我们可以将 PostgreSQL 打造为简单的缓存服务。把 PostgreSQL 变成消息队列
PostgreSQL 原生支持异步通知。本章我们将探讨通过 PostgreSQL 的异步通知,打造一个消息推送服务。
使用 sqlx 操作 PostgreSQL 数组
- 13
- 2025-01-18 15:50:57
PostgreSQL 原生支持数组。本章将讨论如何使用 sqlx 操作 PostgreSQL 的数组。
我们使用一个极简的“朋友圈”动态来做示例。
数据表定义
content
:内容images
:图片,数据类型为varchar(50)
的数组。默认值为空数组
// src/post/model.rs
#[derive(Default, Serialize, Deserialize, FromRow)]
pub struct Post {
pub id: i32,
pub content: String,
pub images: Vec<String>,
}
数据操作
pub async fn create(e: impl PgExecutor<'_>, m: &Post) -> sqlx::Result<i32> {
let (id,): (i32,) =
sqlx::query_as(r#"INSERT INTO posts ("content", images) VALUES ($1, $2) RETURNING id"#)
.bind(&m.content)
.bind(&m.images)
.fetch_one(e)
.await?;
Ok(id)
}
pub async fn find(e: impl PgExecutor<'_>, id: i32) -> sqlx::Result<Option<Post>> {
sqlx::query_as(r#"SELECT id, "content", images FROM posts WHERE id = $1"#)
.bind(id)
.fetch_optional(e)
.await
}
handler
// src/post/handler.rs
#[derive(Deserialize)]
pub struct CreateForm {
content: String,
images: Vec<String>,
}
pub async fn create(
State(state): State<ArcAppState>,
Json(frm): Json<CreateForm>,
) -> Result<Json<i32>> {
let id = model::create(
&state.pool,
&model::Post {
content: frm.content,
images: frm.images,
..Default::default()
},
)
.await?;
Ok(Json(id))
}
pub async fn find(
State(state): State<ArcAppState>,
Path(id): Path<i32>,
) -> Result<Json<model::Post>> {
let post = match model::find(&state.pool, id).await? {
Some(v) => v,
None => return Err(Error::new("不存在的记录")),
};
Ok(Json(post))
}
// rest/post.http
## 新建
POST http://127.0.0.1:9527/post
Content-Type: application/json
{
"content":"sqlx 操作 postgreSQL",
"images":["foo.png", "bar.png", "foobar.jpg"]
}
## 查找
GET http://127.0.0.1:9527/post/1
Content-Type: application/json
本章代码位于 03.array
分支。