2016-08-31 55 views
0

剛剛開始使用PostgreSQL 9.5,並遇到了我的第一個jsonb列問題。我一直在試圖找到一個答案,但一段時間都不好。有人可以幫忙嗎?在postgres中插入包含json對象的數組作爲行9.5

我有一個包含Python JSON對象JSON數組是這樣的:

[{"name":"foo", "age":"18"}, {"name":"bar", "age":"18"}] 

我試圖插入一個jsonb列這樣的:

COPY person(person_jsonb) FROM '/path/to/my/json/file.json'; 

但只有1排得插入。我希望能有數組中的每個JSON對象作爲新行是這樣的:

1. {"name":"foo", "age":"18"} 
2. {"name":"bar", "age":"18"} 

也試過:

INSERT INTO person(person_jsonb) 
       VALUES (%s) 
       ,(json.dumps(data['person']) 

不過只有一排被插入。有人可以幫忙嗎?

編輯:

{"person":[{"name":"foo", "age":"18"}, {"name":"bar", "age":"18"}]} 
+0

顯示的F部分線路你正在複製。在'insert'嘗試的地方顯示相關的代碼。 –

+0

感謝您的反饋意見。我做了一些編輯,包括更多的細節:) – Saan

回答

1

假設最簡單的架構:

CREATE TABLE test(data jsonb); 

選項1:作爲請求

import psycopg2, sys, json 

con = None 
orders_file_path = '/path/to/my/json/person.json' 

try: 

    with open(orders_file_path) as data_file: 
     data = json.load(data_file) 
    con = psycopg2.connect(...) 
    cur = con.cursor() 
    person = data['person'] 
    cur.execute(""" 
        INSERT INTO orders(orders_jsonb) 
        VALUES (%s) 
       """, (json.dumps(person),)) 
    con.commit() 

    except psycopg2.DatabaseError, e: 
     if con: 
      con.rollback() 

    finally: 

     if con: 
      con.close() 

person.json文件添加Python代碼解析JSON中Python的

你需要開插入PostgreSQL中的每一行,你可以解析JSON on Python side和分裂上層數組,然後使用cursor.executemany每個JSON數據執行INSERT已經分裂:

import json 
import psycopg2 

con = psycopg2.connect('...') 

cur = con.cursor() 

data = json.loads('[{"name":"foo", "age":"18"}, {"name":"bar", "age":"18"}]') 

with con.cursor() as cur: 
    cur.executemany('INSERT INTO test(data) VALUES(%s)', [(json.dumps(d),) for d in data]) 

con.commit() 
con.close() 

選項2 :PostgreSQL中解析JSON

另一種選擇是推動JSON processing into PostgreSQL side using json_array_elements

import psycopg2 

con = psycopg2.connect('...') 

cur = con.cursor() 

data = '[{"name":"foo", "age":"18"}, {"name":"bar", "age":"18"}]' 

with con.cursor() as cur: 
    cur.execute('INSERT INTO test(data) SELECT * FROM json_array_elements(%s)', (data,)) 

con.commit() 
con.close() 
+0

啊,謝謝你,先生!這就像一個魅力! – Saan

相關問題