首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用psycopg2更新JSONB

使用psycopg2更新JSONB
EN

Stack Overflow用户
提问于 2020-11-17 11:59:18
回答 1查看 559关注 0票数 3

以下针对多模式PostgreSQL (v.12) DB的SQL语句是完全有效的,并且达到了预期的结果。

我需要更新一个很深的JSONB值,如下所示:

代码语言:javascript
复制
UPDATE schema."Some_table_name" SET jsonb_col = jsonb_set(jsonb_col, '{path,to,key}', '"string value"') WHERE id = 1;

当我尝试使用psycopg2从python中执行上述操作时,我不会收到任何错误,但也不会得到任何更新。

代码语言:javascript
复制
def update_method(schema, path, value):
   q = f"""UPDATE {schema}."Some_table_name" SET jsonb_col = jsonb_set(jsonb_col, '{path}', '{value}') WHERE id = 1"""
   cur = conn.cursor()
   cur.execute(q)
   conn.commit()
   cur.close()

update_method('schema_name', '{path,to,key}', '"string value"') 

我试图将路径具体转换为:q语句中的路径:'{path}'::text[]。仍然没有错误,也没有更新。

知道如何使用psycopg2和上面这样的方法更新深度JSONB吗?

编辑--在阅读了评论并尝试了@Abelisto的代码之后,我意识到了什么会起作用(而且我觉得有点傻)。以下代码正确地更新任何深度JSONB值:

代码语言:javascript
复制
def update_method(connection, schema, path, value):
   q = f"""UPDATE {schema}."Some_table_name" SET jsonb_col = jsonb_set(jsonb_col, '{path}', '{value}') WHERE id = 1"""
   cur = connection.cursor()
   cur.execute(q)
   connection.commit()
   cur.close()

update_method(conn, 'schema_name', '{path,to,key}', '"string value"') 
EN

回答 1

Stack Overflow用户

发布于 2020-11-17 15:47:15

它实际上不是解决方案,但很难在注释中发布python代码。

这个问题确实需要一些调试。海事组织的这段代码片段应该足以找到问题的根源:

代码语言:javascript
复制
#!/usr/bin/python3

import psycopg2

schema_name = 'pg_temp'
table_name = 'foo'
init_value = '{"a": "x", "b": {"c": "y"}}'

conn = psycopg2.connect('')

c = conn.cursor();
c.execute(f"""create table {schema_name}.{table_name}(id int, col jsonb)""")
c.execute(f"""insert into {schema_name}.{table_name} values(1, '{init_value}')""")
c.execute(f"""select * from {schema_name}.{table_name} where id = 1""")
print(c.fetchall())

def update_method(schema, path, value):
    qs = f"""select * from {schema}.{table_name} where id = 1"""
    q = f"""UPDATE {schema}.{table_name} SET col = jsonb_set(col, '{path}', '{value}') WHERE id = 1"""
    cur = conn.cursor()
    cur.execute(qs)
    print(cur.fetchall())
    print(q)
    cur.execute(q)
    cur.execute(qs)
    print(cur.fetchall())
    conn.commit()
    cur.close()

update_method(schema_name, '{b,c}', '"string value"') 

输出:

代码语言:javascript
复制
[(1, {'a': 'x', 'b': {'c': 'y'}})]
[(1, {'a': 'x', 'b': {'c': 'y'}})]
UPDATE pg_temp.foo SET col = jsonb_set(col, '{b,c}', '"string value"') WHERE id = 1
[(1, {'a': 'x', 'b': {'c': 'string value'}})]

正如您所看到的,代码适用于这个简单的测试用例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64874874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档