web-dev-qa-db-ja.com

psycopg2 insert python jsonとしての辞書

python辞書をjsonとしてpostgresqlデータベースに挿入したい(pythonおよびpsycopg2経由))。

私が持っています:

thedictionary = {'price money': '$1', 'name': 'Google', 'color': '', 'imgurl': 'http://www.google.com/images/nav_logo225.png', 'charateristics': 'No Description', 'store': 'google'}

cur.execute("INSERT INTO product(store_id, url, price, charecteristics, color, dimensions) VALUES (%d, %s, %s, %d, %s, %s)", (1,  'http://www.google.com', '$20', thedictionary, 'red', '8.5x11'))

そして、エラーメッセージが表示されます:

cur.execute( "INSERT INTO product(store_id、url、price、charecteristics、color、dimensions)VALUES(%d、%s、%s、%d、%s、%s)"、(1、 ' http://www.google.com '、' $ 20 '、thedictionary、' red '、' 8.5x11 '))psycopg2.ProgrammingError:タイプ' dict 'を適応できません

ここから先に進む方法がわかりません。この正確な種類のことを行う方法についてインターネット上で何も見つけることができず、psycopg2には非常に新しいです。

20
Rorschach
cur.execute("INSERT INTO product(store_id, url, price, charecteristics, color, dimensions) VALUES (%s, %s, %s, %s, %s, %s)", (1,  'http://www.google.com', '$20', json.dumps(thedictionary), 'red', '8.5x11'))

これで問題が解決します。ただし、実際にはキーと値を個別の列に格納する必要があります。辞書を取得するには、次を実行します。

cur.execute('select charecteristics from product where store_id = 1')
dictionary = json.loads(cur.fetchone()[0])
42
hd1

psycopg2.extras.Jsonを使用して、dictをpostgreが受け入れるJSONに変換できます。

from psycopg2.extras import Json

thedictionary = {'price money': '$1', 
'name': 'Google', 'color': '', 'imgurl': 'http://www.google.com/images/nav_logo225.png', 'charateristics': 'No Description', 'store': 'google'}

item ={
    "store_id":1,
    "url": 'http://www.google.com', 
    "price":'$20', 
    "charecteristics":Json(thedictionary), 
    "color":'red', 
    "dimensions":'8.5x11'
}

def sql_insert(tableName, data_dict):
    '''
    INSERT INTO product (store_id,  url,  price,  charecteristics,  color,  dimensions)
    VALUES (%(store_id)s, %(url)s, %(price)s, %(charecteristics)s, %(color)s, %(dimensions)s );
    '''
    sql = '''
        INSERT INTO %s (%s)
        VALUES (%%(%s)s );
        '''   % (tableName, ',  '.join(data_dict),  ')s, %('.join(data_dict))
    return sql

tableName = 'product'
sql = sql_insert(tableName, item)

cur.execute(sql, item)

詳細については、 公式ドキュメント を参照してください。

class psycopg2.extras.Json(adapted, dumps=None)

    An ISQLQuote wrapper to adapt a Python object to json data type.

    Json can be used to wrap any object supported by the provided dumps function. If none is provided, the standard json.dumps() is used (simplejson for Python < 2.6; getquoted() will raise ImportError if the module is not available).

    dumps(obj)
    Serialize obj in JSON format.

    The default is to call json.dumps() or the dumps function provided in the constructor. You can override this method to create a customized JSON wrapper.
6
l mingzhi

psycopg docs から:

注register_adapter()を使用して、任意のPython辞書をJSONに適応させ、Jsonまたはサブクラスまたは互換性のあるアダプターを作成するサブクラスを登録できます。

psycopg2.extensions.register_adapter(dict, psycopg2.extras.Json)

ただし、この設定はグローバルであるため、register_hstore()によって登録されたアダプターなどの類似のアダプターとは互換性がありません。 JSONでサポートされる他のオブジェクトも同じ方法で登録できますが、これによりデフォルトの適応ルールが上書きされるため、望ましくない副作用に注意してください。

だから、私の場合、私がやったことは:

from psycopg2.extensions import register_adapter

register_adapter(dict, Json)

それは魅力のように働いた。

3
Felipe Augusto