Python 使用psycopg2更新JSONB

Python 使用psycopg2更新JSONB,python,postgresql,psycopg2,jsonb,Python,Postgresql,Psycopg2,Jsonb,以下针对多模式PostgreSQL(v.12)DB的SQL语句是完全有效的,它实现了预期的结果 我需要更新一个深层JSONB值,如下所示: updateschema.“Some_table_name”SET jsonb_col=jsonb_SET(jsonb_col,{path,to,key}','string value'),其中id=1; 当我尝试从python使用psycopg2执行上述操作时,我没有收到任何错误,但也没有更新 def update_方法(模式、路径、值): q=f“”“

以下针对多模式PostgreSQL(v.12)DB的SQL语句是完全有效的,它实现了预期的结果

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

updateschema.“Some_table_name”SET jsonb_col=jsonb_SET(jsonb_col,{path,to,key}','string value'),其中id=1;
当我尝试从python使用
psycopg2
执行上述操作时,我没有收到任何错误,但也没有更新

def update_方法(模式、路径、值):
q=f“”“更新{schema}.”一些表名“SET jsonb_col=jsonb_SET(jsonb_col,{path},{value}'),其中id=1“”
cur=连接光标()
当前执行(q)
康涅狄格州提交
当前关闭()
更新_方法('schema_name','{path,to,key}',''string value')
我试图在我的
q
语句中具体地强制转换路径,如:
'{path}'::text[]
。仍然没有错误,也没有更新

知道如何使用
psycopg2
和上面的方法更新深层JSONB吗

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

def update_方法(连接、架构、路径、值):
q=f“”“更新{schema}.”一些表名“SET jsonb_col=jsonb_SET(jsonb_col,{path},{value}'),其中id=1“”
cur=connection.cursor()
当前执行(q)
commit()连接
当前关闭()
更新_方法(conn,'schema_name','{path,to,key}',''string value')

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

这个问题肯定需要一些调试。IMO此代码片段应足以找到问题的根源:

#!/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"') 
输出:

[(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'}})]

正如您所看到的,这个简单测试用例的代码是有效的。

您真的错过了python代码中的
jsonb_集
,还是仅仅是输入错误?@Abelisto,仅仅是输入错误。对我来说是有效的(尽管它可能会受到SQL注入攻击)。可能给定的路径实际上不存在于指定的行中,因此更新不会做出任何可见的更改。对于我来说,这是一个谜,为什么全局变量不起作用,而是使用它作为它起作用的函数参数。请发布关于第一个和第二个代码段的答案,以及为什么第一个代码段失败,第二个代码段成功。