sql >> データベース >  >> RDS >> PostgreSQL

postgresqlへのdictオブジェクトの追加

    PostgreSQLのバージョンが十分に新しく(9.4+)、psycopgのバージョンが2.5.4以上の場合、すべてのキーが文字列であり、値をJSONとして表すことができる場合は、これをJSONB列に格納するのが最適です。その後、必要に応じて、列も検索可能になります。単純にテーブルを作成するだけです

    CREATE TABLE thetable (
        uuid TEXT,
        dict JSONB
    );
    

    (...そして必要に応じてインデックスや主キーなどを自然に追加します...)辞書をPostgreSQLに送信するときは、Jsonでラップする必要があります。 アダプタ; PostgreSQLから受信すると、JSONB値は自動的に辞書に変換されるため、挿入すると

    になります。
    from psycopg2.extras import Json, DictCursor
    
    cur = conn.cursor(cursor_factory=DictCursor)
    
    cur.execute('INSERT into thetable (uuid, dict) values (%s, %s)',
        ['testName', Json({'id':'122','name':'test','number':'444-444-4444'})])
    

    選択は簡単です

    cur.execute('SELECT dict FROM thetable where uuid = %s', ['testName'])
    row = cur.fetchone()
    print(row['dict']) # its now a dictionary object with all the keys restored
    print(row['dict']['number']) # the value of the number key
    

    JSONBを使用すると、PostgreSQLは、辞書をテキストとしてダンプするよりも効率的に値を格納できます。さらに、データを使用してクエリを実行できるようになります。たとえば、JSONB列からいくつかのフィールドを選択するだけです。

    >>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
    >>> cur.fetchone()
    ['122', '444-444-4444']
    

    または、必要に応じてクエリで使用できます:

    >>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
        ['444-444-4444'])
    >>> cur.fetchall()
    [['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]
    


    1. oracle11gでパラメータ化されたビューを作成する

    2. ビデオ:RACでのOracle12cIDENTITY列のパフォーマンス

    3. SQLServerクエリをMySQLに変換する

    4. MySQL(パフォーマンスとストレージ)でNULL