使用 Python 在 Postgres 中传递 JSON 文件

Passing JSON file in Postgres with Python

connection = psycopg2.connect("dbname=db1 user=postgres password=postgres")
cursor = connection.cursor()
cursor.execute("set search_path to public")

with open('json_template') as file:
    data = file.read()

query_sql = """
insert into table1 select * from
json_populate_recordset(NULL::table1, %s);
"""

# change .execute(query_sql) to .execute(query_sql, (data,))
cursor.execute(query_sql, (data,))
connection.commit()

所以我试图将“json_template.json”的内容传递给 Postgres table,但是当我这样做时,我得到了这个错误: psycopg2.errors.InvalidParameterValue: 无法在对象上调用 json_populate_recordset

我通过 psql 命令创建了 table。此外,这是我的 json_template 文件的内容:

{"key": "A123", "value": "15.6", "ts":"2020-10-07 13:28:43.399620+02:00"} 附上截图:json_template.json.

对该错误进行了一些研究,但没有发现任何结果。还尝试以其他方式 重写代码 几次 - 仍然是同样的错误。

提前致谢!

你有一个 JSON object,所以你需要使用 json_populate_record 而不是 json_populate_recordset,它适用于对象数组。

import psycopg2

con = psycopg2.connect(...)
cursor = con.cursor()

with open('json_template') as file:
    data = file.read()

query_sql = """
insert into table1 select * from
json_populate_record(NULL::table1, %s);
"""

cursor.execute(query_sql, (data,))
con.commit()
cursor.execute('select * from table1')
print(cursor.fetchall())

输出:

[('A123', '15.6', '2020-10-07 13:28:43.399620+02:00')]

我刚刚 更改了 JSON 文件来自:

{"key": "A123", "value": "15.6", "ts":"2020-10-07 13:28:43.399620+02:00"}

收件人:

[
    {
        "key": "A128",
        "value": "15.6",
        "ts": "2020-10-07 13:28:43.399620+02:00"
    }
]

它奏效了。谢谢大家的帮助!