Postgresql
使用 Python 將 JSON 插入 PostgreSQL
我有下表:
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),))