如何使用 Slick 将 json 对象插入 Postgres 中类型为 jsonb 的列
How to Insert a json object to a column of type jsonb in Postgres using Slick
我正在尝试使用 Slick 将 json 对象插入到 Postgres 中 jsonb 类型的列中。这是我到目前为止尝试过的方法..
<pre><code>implicit val attributesJsonFormat = jsonFormat1(Attribute)
implicit val attributesJsonMapper = MappedColumnType.base[Attribute, String](
{ attribute => attribute.toJson.toString() },
{ column => column.parseJson.convertTo[Attribute] }
)
属性大小写 class..
<pre><code>case class Attribute(randomVal: Int)
在这里,我期望 Slick 在读取和写入之间进行隐式转换。但是我收到以下错误..
column \"attributes\" is of type jsonb but expression is of type character varying\n Hint: You will need to rewrite or cast the expression
我假设发生此错误是因为 Slick 试图将对象保存为 varchar。
然后我创建了一个触发器,它将在插入或更新之前调用一个函数。此函数所做的是在保存到数据库之前将相关对象转换为 jsonb。
<pre><code>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 类型的 Slick 支持:
https://github.com/tminglei/slick-pg
对于遇到类似问题的任何人,您可以使用原生 sql 和 jsonb 转换。
sqlu"INSERT INTO accounts VALUES (${account.id}, (to_jsonb($jsonAttribute) #>> '{}')::jsonb)"
执行上述查询会将带有 jsonb 对象的新记录插入属性列。
可以在此处找到更多信息..
https://scala-slick.org/doc/3.0.0/sql.html
我正在尝试使用 Slick 将 json 对象插入到 Postgres 中 jsonb 类型的列中。这是我到目前为止尝试过的方法..
<pre><code>implicit val attributesJsonFormat = jsonFormat1(Attribute)
implicit val attributesJsonMapper = MappedColumnType.base[Attribute, String](
{ attribute => attribute.toJson.toString() },
{ column => column.parseJson.convertTo[Attribute] }
)
属性大小写 class..
<pre><code>case class Attribute(randomVal: Int)
在这里,我期望 Slick 在读取和写入之间进行隐式转换。但是我收到以下错误..
column \"attributes\" is of type jsonb but expression is of type character varying\n Hint: You will need to rewrite or cast the expression
我假设发生此错误是因为 Slick 试图将对象保存为 varchar。
然后我创建了一个触发器,它将在插入或更新之前调用一个函数。此函数所做的是在保存到数据库之前将相关对象转换为 jsonb。
<pre><code>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 类型的 Slick 支持: https://github.com/tminglei/slick-pg
对于遇到类似问题的任何人,您可以使用原生 sql 和 jsonb 转换。
sqlu"INSERT INTO accounts VALUES (${account.id}, (to_jsonb($jsonAttribute) #>> '{}')::jsonb)"
执行上述查询会将带有 jsonb 对象的新记录插入属性列。
可以在此处找到更多信息.. https://scala-slick.org/doc/3.0.0/sql.html