我正在使用Squeryl 0.9.5-7和Postgres 9.4和jsonb数据类型并希望插入一些数据:
case class Log(id: String, meta: String) //meta will contain json
val logs = table[Log]
logs.insert(Log(randomId, "{\"Hi\": \"I'm a json!\"}"))
但得到了一个类型转换错误,上面写着“列元有jsonb类型,但表达式有不同类型的字符。重写表达式或转换它的类型。”
如何将String
字段显式转换为jsonb
,以便原始sql参数看起来像?::jsonb
?
然后,有趣的是如何用Squeryl编写@>
或->>
等json查询?
答案 0 :(得分:2)
我找到了一种更好的方法,在数据库中创建CAST并不需要。
如果您正在使用squeryl 0.9.6,则可以在架构中添加一个显式强制转换,告知squeryl将字符串显式地转换为jsonb。
on(logs)(s => declare(
s.meta is (dbType("jsonb").explicitCast) // enables explicit casting into jsonb
))
答案 1 :(得分:0)
使用Squeryl 0.9.6,您可以注册对自己的自定义类型的支持。这是an example。对于非标准运营商,请查看custom functions
答案 2 :(得分:0)
根据我对postgres 9.4的经验,阅读作为Squeryl字符串工作正常但插入失败时:
错误:列“****”的类型为json,但表达式属于类型 字符变化[错误]提示:你需要重写或转换 表达。 [错误]位置:166 [错误] errorCode:0,sqlState: 42804
所以,我找到的解决方案是在我的postgres数据库中创建一个'AS ASSIGNMENT'演员,这样就可以了:
CREATE CAST(VARCHAR AS JSON)
WITH INOUT
AS ASSIGNMENT