【发布时间】:2021-12-22 11:51:30
【问题描述】:
我正在尝试使用 Slick 将 json 对象插入到 Postgres 中 jsonb 类型的列中。这是我迄今为止尝试过的..
implicit val attributesJsonFormat = jsonFormat1(Attribute)
implicit val attributesJsonMapper = MappedColumnType.base[Attribute, String](
{ attribute => attribute.toJson.toString() },
{ column => column.parseJson.convertTo[Attribute] }
)
属性案例类..
case class Attribute(randomVal: Int)
在这里,我期望 Slick 在读取和写入之间进行隐式转换。但相反,我收到以下错误..
列 \"attributes\" 是 jsonb 类型,但表达式是字符变化类型\n 提示:您需要重写或强制转换表达式
我认为发生此错误是因为 Slick 尝试将对象保存为 varchar。
然后我创建了一个触发器,它将在插入或更新之前调用一个函数。这个函数的作用是在保存到数据库之前将相关对象转换为jsonb。
CREATE OR REPLACE FUNCTION parse_attributes_to_json_in_accounts()
RETURNS TRIGGER AS
$$
BEGIN
NEW.attributes = to_jsonb(NEW.attributes);
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER tr_parse_attributes_to_json
BEFORE INSERT OR UPDATE
ON accounts
FOR EACH ROW
EXECUTE PROCEDURE parse_attributes_to_json_in_accounts();
ALTER FUNCTION parse_attributes_to_json_in_accounts() OWNER TO app;
即使在此解决方案之后,我仍然会收到相同的错误消息。我猜 Slick 在达到这一点之前就抛出了异常?有什么想法可以让它工作吗?
【问题讨论】:
标签: postgresql scala slick jsonb