2017-02-05 4 views
1

現在、psycopg2を使用して成功していないjsonオブジェクトの2つのリストをpostgresqlデータベースに格納しようとしています。ここでPythonを使用したPostgresqlでのJsonオブジェクトの配列の格納

は、この現在の実装では、このエラーが生じている

SQL_INSERT_QUERY = """INSERT INTO table (
           x, 
           json_list_one, 
           json_list_two 
          ) VALUES (%s, %s, %s)""" 

def insert_stuff(id, json_list_one, json_list_two): 
values = (
    id, 
    map(psycopg2.extras.Json, json_list_one), 
    map(psycopg2.extras.Json, json_list_two) 
) 
conn = get_connection_pool().getconn() 
try: 
    cur = conn.cursor() 
    cur.execute(SQL_INSERT_QUERY, values) 
    conn.commit() 
    cur.close() 
finally: 
    get_connection_pool().putconn(conn) 

...私が何をしようとしています何の抜粋です...

An exception of type ProgrammingError occured. Arguments: 
('column "json_list_one" is of type json[] but expression is of type text[]\nLINE 5: ...) VALUES (\'9527d790-31dc-46fa-b683-c6fc9807c2a4\', ARRAY[\'{"h...\n                ^\nHINT: You will need to rewrite or cast the expression.\n',) 

することは私がすることが出来るのですか誰でも知っていますPostgreSQLにjsonオブジェクトの配列を挿入しますか?

ありがとうございます。

答えて

2

あなたは息子に値をキャストする必要がある -

SQL_INSERT_QUERY = """INSERT INTO table (
           x, 
           json_list_one, 
           json_list_two 
          ) VALUES (%s, %s::json[], %s::json[])""" 

そして、あなたは、PostgreSQL 9.5以降を使用するあなたはJSONフィールド上問い合わせる必要がある場合jsonbするJSONを変更することをお勧めします。 Jsonbは、クエリのパフォーマンスを向上させるよりもGINインデックスを作成することができます。

+0

これは 'DETAIL:配列値は" {"または" dimension information'で始まらなければなりません。何が間違っているのでしょうか? – FeedTheWeb

+0

デフォルトでは、postgresは未知のデータをテキストとしてキャストします。 '' json_list_one ''の型はjson []ですが、式はtext型の型ではなく、 '' text [] ''型のエラーです。 –

-1

jsonライブラリを使用し、json.dumps(dict_here)に電話する必要があります。 JsonはPostgresでサポートされている型ではありません。辞書をjson文字列に変換する場合はjson.dumpsを使用し、辞書に戻す場合はjson.loadsを使用します。

+2

実際にPosgreSQLはJsonタイプをサポートしています(9.3以降)。私は他のテーブルにJson(配列ではない)を格納しています。 – Dylan

関連する問題