数据表定义
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>,
}
- PostgreSQL 中的数组可以直接和 Rust 的 Vec 进行映射
数据操作
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