7
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PythonからPostgreSQLのデータ型(jsonb)を使う

Last updated at Posted at 2017-03-26

PostgreSQL特有のデータ側をPythonから利用する方法について調べたので記録しておきます。

ここで紹介するのはjsonb型についてです。

この内容は、第51回 長岡IT開発者勉強会で発表した内容の抜粋です。スライドはこちらです。

Java版はこちらです。

PostgreSQLをPythonから利用する

利用方法

アプリケーションからPostgreSQLを使用するときには、DB API経由で使う。
DB APIは仕様で実装の一つとしてpsycopg2がある。psycopg2はPostgreSQL公式Cクライアントライブラリのlibpqを内部で使用している。

ソースコード

https://github.com/civic/postgresql-python-json

jsonbを利用する

id info
1 {"a": 100, "b": "Hello"}
2 {"a": 200, "b": "World"}
CREATE TABLE json_test(
  id integer,
  info jsonb
)

低レベルAPI(psycopg2)からjsonbの利用

SELECT

cur.execute(
"SELECT info FROM json_test WHERE id=1"
)
row = cur.fetchone()
print(row[0])
# {'b': 'Hello', 'a': 100}

jsonの列を取得すると、dict(Pythonの辞書型)で取得できる。

INSERT (1)

from psycopg2.extras import Json

#json objectで更新
cur.execute(
  "INSERT INTO json_test(info) VALUES(%s)",
  [ 
    Json({"a":30, "b": "update"})
  ]
)

psycopg2が提供するJsonオブジェクトでパラメータをセットする。
psycopg2.extras.Jsonを使用する。dict→Json。

INSERT (2)

import json

# dictを文字列化してSQLに渡す
cur.execute(
  "INSERT INTO json_test(info) VALUES(jsonb(%s))",
  [
    json.dumps({"a":30, "b": "update"}) //dict→str
  ]
)

JSON文字列としてパラメータをセットし、SQL文でjsonbにキャストするパターン。
この場合DB APIのインターフェースで使用できる。

高レベルAPI(SQLAlchemy)からjsonbの利用

SELECT / INSERT

from sqlalchemy.dialects.postgresql import JSONB

class JsonTest(Base):
    __tablename__ = 'json_test'
    id = Column(Integer, primary_key=True)
    info = Column(JSONB)  # JSONB型の列と宣言
    ...

ORマッパーの機能を提供するSQLAlchemyの場合、列定義にpostgresql方言(dialect)が使用できる。

7
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?