python - 使用 psycopg2 更新 JSONB
问题描述
以下针对多模式 PostgreSQL (v.12) 数据库的 SQL 语句是一个完全有效的语句,它达到了预期的结果。
我需要更新一个深度 JSONB 值,如下所示:
UPDATE schema."Some_table_name" SET jsonb_col = jsonb_set(jsonb_col, '{path,to,key}', '"string value"') WHERE id = 1;
当我尝试从 python using 执行上述操作时psycopg2
,我没有收到任何错误,但也没有更新。
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 值:
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"')
解决方案
这实际上不是解决方案,但很难在评论中发布 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'}})]
如您所见,代码适用于这个简单的测试用例。
推荐阅读
- mapbox - 如何使用用户自己的访问令牌嵌入公共 Mapbox 样式
- amazon-web-services - AWS Cognito 使用哪个哈希函数来存储用户的密码
- swift - 如何以编程方式在 macOS(不是 iOS)上的 SwiftUI 中从后台打开应用程序窗口?
- django - 将旧版经典 asp 网站移至 django 应用程序,但 django URL 重定向应用程序出现问题 - 带有参数的旧 URL 出现 500 错误
- vb.net - 索引超出数组范围?
- excel - 如何在 2 行中打破这个形状参考代码?
- python - 给定列表和整数时返回列表中的元素
- python - Broyden 在 Python 中的方法实现
- jquery - 在DIV结束后使固定元素滚动内容(滚动,不会在一瞬间消失)
- javascript - SQL 在数据库中插入空记录 - 使用 JavaScript