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>>:
- 修改
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(()) }
- 调用函数时:
- 要插入有效 JSON 数据:传入
Some(Json(Person { ... })) - 要插入数据库 NULL:直接传入
None
- 要插入有效 JSON 数据:传入
原理说明
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
相关产品推荐
相关产品推荐

