pub fn json_patch<T: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue, P: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue + CombinedNullableValue<T, Json>, target, patch>(
target: target,
patch: patch,
) -> json_patch<T, P, target, patch>where
target: AsExpression<T>,
patch: AsExpression<P>,Available on crate feature
sqlite only.Expand description
Applies an RFC 7396 MergePatch patch to the input JSON target and
returns the patched JSON value.
MergePatch can add, modify, or delete elements of a JSON object. Arrays are treated as atomic values: they can only be inserted, replaced, or deleted as a whole, not modified element-wise.
ยงExamples
let result = diesel::select(json_patch::<Json, Json, _, _>(
json!( {"a":1,"b":2} ),
json!( {"c":3,"d":4} ),
))
.get_result::<Value>(connection)?;
assert_eq!(json!({"a":1,"b":2,"c":3,"d":4}), result);
let result = diesel::select(json_patch::<Json, Json, _, _>(
json!( {"a":[1,2],"b":2} ),
json!( {"a":9} ),
))
.get_result::<Value>(connection)?;
assert_eq!(json!({"a":9,"b":2}), result);
let result = diesel::select(json_patch::<Json, Json, _, _>(
json!( {"a":[1,2],"b":2} ),
json!( {"a":null} ),
))
.get_result::<Value>(connection)?;
assert_eq!(json!({"b":2}), result);
let result = diesel::select(json_patch::<Json, Json, _, _>(
json!( {"a":1,"b":2} ),
json!( {"a":9,"b":null,"c":8} ),
))
.get_result::<Value>(connection)?;
assert_eq!(json!({"a":9,"c":8}), result);
let result = diesel::select(json_patch::<Json, Json, _, _>(
json!( {"a":{"x":1,"y":2},"b":3} ),
json!( {"a":{"y":9},"c":8} ),
))
.get_result::<Value>(connection)?;
assert_eq!(
json!({"a":{"x":1,"y":9},"b":3,"c":8}),
result
);
// Nullable input yields nullable output
let result = diesel::select(json_patch::<Nullable<Json>, Json, _, _>(
None::<Value>,
json!({}),
))
.get_result::<Option<Value>>(connection)?;
assert!(result.is_none());