我想使用PostgreSQL的jsonb_path_exists
函数和diesel
。
我从编译的函数定义开始。
diesel::sql_function! {
/// https://www.postgresql.org/docs/current/functions-json.html
fn jsonb_path_exists(
jsonb: diesel::sql_types::Nullable<diesel::sql_types::Jsonb>,
path: diesel::sql_types::Text,
) -> diesel::sql_types::Bool;
}
字符串
现在我在使用函数时得到一个运行时错误:
mytable::table.filter(
jsonb_path_exists(
activities::activity_object,
format!(r#"$.**.id ? (@ == "some-uuid")"#),
),
)
型
上面的失败与diesel error: function jsonb_path_exists(jsonb, text) does not exist
。
看看jsonb_path_exists
的签名,我发现问题出在第二个参数:diesel::sql_types::Text
。它应该是一个jsonpath而不是text。
jsonb_path_exists ( target jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → boolean
型
我通过调试打印查询,用单引号替换双引号,并对数据库手动运行它来证实这一点。
我不知道如何定义一个新的diesel SQL类型,使diesel正确地将String
视为Postgres path
类型并发出单引号。查看现有类型,我没有找到任何可以类似地实现的东西。
编辑:
添加一个新的SqlType
是一个开始。然而,如何为一些struct JsonPath(String)
实现AsExpression<JsonPathType>
还不清楚。
/// Q: How do we know the oid?
/// A: `SELECT typname, oid, typarray FROM pg_type WHERE typname = 'jsonpath';`
#[derive(Debug, Clone, Copy, Default, QueryId, SqlType)]
#[diesel(postgres_type(oid = 4072, array_oid = 4073))]
pub struct JsonPathType;
型
1条答案
按热度按时间zengzsys1#
在weiznich对gitter的帮助下,我解决了转换问题,概括地说,二进制格式是路径字符串作为字节加上一个版本。
字符串
我在postgres代码库中找到了正确的版本:
型