- 支持试读
为什么选择 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 数组
- 116
- 2025-01-18 15:50:57
PostgreSQL 原生支持数组。本章将讨论如何使用 sqlx 操作 PostgreSQL 的数组。
我们使用一个极简的“朋友圈”动态来做示例。
数据表定义
CREATE TABLE IF NOT EXISTS "posts"(
"id" SERIAL PRIMARY KEY,
"content" VARCHAR(255) NOT NULL,
"images" VARCHAR(50)[] NOT NULL DEFAULT '{}'::VARCHAR(50)[]
);
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
}
create()
:用于新建一条记录。可以直接把 Vec 绑定到 PostgreSQL 的数组find()
:根据ID查找记录
测试
本章代码位于 03.array
分支。