Postgresql

使用 Python 將 JSON 插入 PostgreSQL

  • June 2, 2020

我有下表:

create table json_table (
   p_id int primary key,
   first_name varchar(20),
   last_name varchar(20),
   p_attribute json,
   quote_content text
)

現在我基本上想在python腳本的幫助下載入一個json對象,讓python腳本將json插入到表中。我已經實現了通過 psql 插入 JSON,但它並沒有真正插入 JSON 文件,它更多的是插入一個相當於 JSON 文件的字元串,而 PostgreSQL 只是將其視為 json。

我用 psql 做了什麼來實現插入 JSON 文件:

讀取文件並將內容載入到變數中

\set content type C:\PATH\data.json

使用 json_populate_recordset() 和預定義的變數“內容”插入 JSON:

insert into json_table select * from json_populate_recordset(NULL:: json_table, :'content');

這很好用,但我希望我的 python 腳本也能這樣做。在以下程式碼中,連接已經建立:

connection = psycopg2.connect(connection_string)
cursor = connection.cursor()
cursor.execute("set search_path to public")


with open('data.json') as file:
       data = json.load(file)

query_sql = """
insert into json_table select * from
json_populate_recordset(NULL::json_table, '{}');
""".format(data)

cursor.execute(query_sql)

我收到以下錯誤:

Traceback (most recent call last):
 File "C:/PATH", line 24, in <module>
   main()
 File "C:/PATH", line 20, in main
   cursor.execute(query_sql)
psycopg2.errors.SyntaxError: syntax error at or near "p_id"
LINE 3:     json_populate_recordset(NULL::json_table, '[{'p_id': 1, ...

如果我將 JSON 內容粘貼到 pgAdmin4 中並使用 json_populate_recordset() 中的字元串,它就可以工作。我假設我錯誤地處理了 JSON 文件……

我的 data.json 看起來像這樣:

[
   {
       "p_id": 1,
       "first_name": "Jane",
       "last_name": "Doe",
       "p_attribute": {
           "age": "37",
           "hair_color": "blue",
           "profession": "example",
           "favourite_quote": "I am the classic example"
       },
       "quote_content": "'am':2 'classic':4 'example':5 'i':1 'the':3"
   },
   {
       "p_id": 2,
       "first_name": "Gordon",
       "last_name": "Ramsay",
       "p_attribute": {
           "age": "53",
           "hair_color": "blonde",
           "profession": "chef",
           "favourite_quote": "Where is the lamb sauce?!"
       },
       "quote_content": "'is':2 'lamb':4 'sauce':5 'the':3 'where':1"
   }
]

遵循psycopg 文件。另外,使用json. dumps因為(尚)不支持 dict 轉換。

import json
import psycopg2

with psycopg2.connect('') as conn:
   with conn.cursor() as cur:
       with open('pg-json-import.json') as my_file:
           data = json.load(my_file)
           cur.execute(""" create table if not exists json_table(
               p_id integer, first_name text, last_name text, p_attribute jsonb,
               quote_content text) """)
           query_sql = """ insert into json_table
               select * from json_populate_recordset(NULL::json_table, %s) """
           cur.execute(query_sql, (json.dumps(data),))

引用自:https://dba.stackexchange.com/questions/268365