2016-07-08 14 views
0

私は数百のJsonオブジェクトを含むjsonファイルを持っています。複数のJSONオブジェクトをPostgreSQLに追加

マイPostgreSQLのテーブルは次のように作成されました:

CREATE TABLE collections(
id serial, 
collection json); 

それはINSERT INTO collections (collection) values (json_object);を使用してテーブルに一度に一つのオブジェクトを追加することができますが、それは退屈で、持続可能ではありません。これを行うより良い方法は何でしょうか? I(2)キーに対応する列を作成し、そうような値を追加し、そこに一時テーブルとバルクJSONデータを作成する(1)を作成することであった(explained by this StackOverflow answerように)見出さ

一つの解決策:

create temporary table temp_json (values text) on commit drop; 
copy temp_json from 'C:\SAMPLE.JSON'; 

-- remove this comment to insert records into your table 
-- insert into tbl_staging_eventlog1 ("EId", "Category", "Mac", "Path", "ID") 

select values->>'EId' as EId, 
     values->>'Category' as Category, 
     values->>'Mac' as Mac, 
     values->>'Path' as Path, 
     values->>'ID' as ID  
from (
      select json_array_elements(replace(values,'\','\\')::json) as values 
      from temp_json 
     ) a; 

これNoSQLの全目的を破っています。私は単に、各行にjsonオブジェクトを持つ自動インクリメントIDを格納したいだけです。

+0

問題はありますか? http://stackoverflow.com/q/29497662/3937028 –

+0

@antonio_antuan実際には、この '[{json_object1}、{json_object2}、.....]のようなオブジェクトを持つ1つのJSONファイルがあります。それらは 'row1:1、json_object2 row2:2、json_object2..'のように私のpostgresqlのデータベースに保存されています。これらは何百ものjsonオブジェクトであり、増加していることを念頭に置いてください。 – mugizico

+0

ああ、これを試してみてください:http://adpgtech.blogspot.ru/2014/09/importing-json-data.html?m=1 –

答えて

1

興味があれば、私はpsycopg2パッケージを使ってPythonでそれを行う方法を考え出しました。適切なフィールド(データベース、ユーザー名、パスワードなど)を必ず入力してください。

import psycopg2 
import json 


path_to_file = input('Enter path to json file:') 
with open(path_to_file, 'r') as data_file: 
    data = json.load(data_file) 

collection_array = [] 
for item in data: 
    collection_array.append(json.dumps(item)) 



try: 
    conn = psycopg2.connect(database="", user="", password="",host="127.0.0.1",port="5433") 
    print ("opened database successfully") 
    cur = conn.cursor() 

    for element in collection_array: 
     cur.execute("INSERT INTO my_table (json_column_name) VALUES (%s)", (element,)) 
    print("successfully inserted records")  


except psycopg2.Error as e: 
    raise 

finally: 
    conn.commit() 
    conn.close() 
    print("connection is closed") 
+0

クール、あなたはそれに私を打つ。それは私がお勧めするものに非常に近いです。 – Feneric

+0

@Feneric haha​​ yea私はそれに亀裂を取ることにしました。特に素晴らしいpsycopg2パッケージでは特に難しくありませんでした。 – mugizico

関連する問題