【问题标题】:Explicit jsonb type cast in SquerylSqueryl 中的显式 jsonb 类型转换
【发布时间】:2015-11-12 11:01:56
【问题描述】:

我正在使用带有 jsonb 数据类型的 Squeryl 0.9.5-7 和 Postgres 9.4,并且想要插入一些数据:

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 查询,例如 @>->> 很有趣?

【问题讨论】:

  • 您找到满意的解决方案了吗?

标签: postgresql scala jdbc squeryl


【解决方案1】:

我找到了一种更好的方法,不需要在数据库中创建 CAST。

如果您使用的是 squeryl 0.9.6,您可以在架构中添加显式转换,告诉 squeryl 将您的字符串显式转换为 jsonb。

on(logs)(s => declare(
   s.meta is (dbType("jsonb").explicitCast) // enables explicit casting into jsonb
 ))

【讨论】:

    【解决方案2】:

    使用 Squeryl 0.9.6,您可以注册对您自己的自定义类型的支持。这是an example。非标准操作符请看custom functions

    【讨论】:

    • 你能真正实现强制转换,即::json 只使用自定义类型吗?
    【解决方案3】:

    根据我使用 postgres 9.4 的经验,读取作为 Squeryl 字符串可以正常工作,但插入失败:

    错误:列“****”是 json 类型,但表达式是类型 字符变化 [错误] 提示:您需要重写或强制转换 表达。 [错误]位置:166 [错误]错误代​​码:0,sqlState: 42804

    所以,我找到的解决方案是在我的 postgres 数据库中创建一个“AS ASSIGNMENT”演员表,这样就可以了:

    CREATE CAST(VARCHAR AS JSON)
    WITH INOUT
    AS ASSIGNMENT
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-15
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      • 2011-07-01
      • 1970-01-01
      • 2017-09-10
      相关资源
      最近更新 更多