You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLx插入Option<Json<Struct>>时写入'null'而非NULL问题排查

问题分析与解决方案

核心问题

你遇到的情况是因为**sqlx::types::Json<T> 会将内部的 None 序列化为 JSON 格式的字符串 'null',而非映射到 PostgreSQL 的 NULL 值**。当你使用 Json<Option<Person>> 类型时,即使传入的是 None,Json 包装器也会把它转成字符串 'null' 存入数据库,而不是让字段变为 NULL。

解决方法

要让字段存储 PostgreSQL 的 NULL 值,你需要把参数类型从 Json<Option<Person>> 改为 Option<Json<Person>>:

  1. 修改 add_person 函数的参数类型:
async fn add_person(pool: &Pool<Postgres>, person: Option<Json<Person>>) -> Result<(), sqlx::Error> {
    sqlx::query!(
        r#"INSERT INTO people (person) VALUES ($1)"#,
        person
    )
    .execute(pool)
    .await?;
    Ok(())
}
  1. 调用函数时:
    • 要插入有效 JSON 数据:传入 Some(Json(Person { ... }))
    • 要插入数据库 NULL:直接传入 None

原理说明

  • Json<T> 的作用是将 T 序列化为 JSON 字符串,当 T 是 Option<Person> 且值为 None 时,它会输出 JSON 标准的 null 字符串。
  • Option<Json<T>> 则是告诉 SQLx:整个字段可以是 NULL(当值为 None 时),或者是序列化后的 JSON 字符串(当值为 Some(Json(T)) 时),这才符合你预期的数据库 NULL 行为。

内容的提问来源于stack exchange,提问作者Fred Hors

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:12:43