我有以下postgresql行作为JSONB行:
{age:26}
我想把它替换成这样的i:
{age: 30, city: "new york city"}
我该如何在PostgreSQL中实现这个?有人提到可以使用jsonb_set()
,但我还没有看到任何同时更新多个键的示例。
我有以下postgresql行作为JSONB行:
{age:26}
我想把它替换成这样的i:
{age: 30, city: "new york city"}
我该如何在PostgreSQL中实现这个?有人提到可以使用jsonb_set()
,但我还没有看到任何同时更新多个键的示例。
在 jsonb_set() 中使用 jsonb_set()
jsonb_set(jsonb_set('{age:26}'::jsonb,'{age}','"30"'::jsonb)::jsonb,'{city}','"new york city"'::jsonb)
虽然你可以嵌套使用jsonb_set操作,但这样会变得非常难以阅读。
相反,您可以使用jsonb_object
。
SET my_column = my_column || jsonb_object(
array[ -- keys
'age',
'city',
'visits'
],
array[ -- values
31::text,
'Johannesburg'::text,
((my_column#>>'{visits}')::int + 1)::text -- increment
]
)
PostgreSQL非常优秀。你还可以使用字符串连接运算符||
UPDATE wooden_table
SET doc = doc
|| '{"color" : "red"}'
|| '{"hardness" : "1H"}';
使用SQLAlchemy:
from sqlalchemy import func, and_, any_, cast
from sqlalchemy.dialects.postgresql import JSONB
db.session.query(Model).filter(
Model.id == any_(ids)
).update({
Model.your_jsonb_field: cast(
Model.your_jsonb_field,
JSONB,
).concat(
func.jsonb_build_object('key1', 'value1'),
).concat(
func.jsonb_build_object('key2', 'value2'),
)
}, synchronize_session='fetch')
UPDATE tablename
SET name = ?,
jsonCOl = jsonCol::jsonb || '{"color" : "red"}'::jsonb
WHERE id = ?
这个解决方案非常好,因为它将保存的JSON和覆盖的JSON都强制转换为JSONB,并通过替换右侧||
运算符的所有键来保存它。
在更新数据时,您可以使用jsonb列,并从您拥有的属性创建json格式数据,执行jsonb操作时需要记住以下四点:
select jsonb_set(jsonb_set('{}'::jsonb,'{age}','30',true)::jsonb,'{city}',to_jsonb('hyd'::text),true)::jsonb;