Más contenido relacionado
La actualidad más candente (20)
Similar a 第51回NDS PostgreSQLのデータ型 #nds51 (20)
第51回NDS PostgreSQLのデータ型 #nds51
- 22. 本の情報 books
CREATE TABLE books(
id integer PRIMARY KEY,
name text,
price integer,
info jsonb
);
INSERT INTO books VALUES
(1, 'book1', 45745,
'{"format": "text", "tags": ["english","game","
- 23. 検索
SELECT * FROM books
WHERE
info @> '{"format": "pdf"}'::jsonb;
formatがpdfの本を検索
@> 包含演算子
JSONパス・値を保持するか
- 27. 範囲型
• 数値
• int4range: 4バイト整数範囲
• int8range: 8バイト整数範囲
• numrange: 実数範囲
• 日付
• tsrange: 日付時刻範囲
• tszrange: 日付時刻範囲(タイムゾーンつき)
• daterange: 日付範囲
- 34. 予約テーブル
• EXCLUDEの排他制約で予約の重複を防ぐ制約
CREATE TABLE reservation(
during daterange,
EXCLUDE USING GIST(during WITH &&)
);
INSERT INTO reservation
VALUES('[2017-03-10, 2017-03-12]');
INSERT INTO reservation
VALUES('[2017-03-11, 2017-03-13]');
--重なりがあるのでエラー
↑duringの重なりの排他
- 41. 具体的に考えてみる
• jsonb型をJava / Pythonから利用
CREATE TABLE json_test(
id integer,
info jsonb
)
id info
1 {"a": 100, "b": "Hello"}
2 {"a": 200, "b": "World"}
- 45. JDBC API (低レベルAPI)
INSERT
PGobjectを使用。 ※postgresqlドライバの機能
import org.postgresql.util.PGobject;
PGobject pgobj =new PGobject();
pgobj.setValue(json_string); //json文字列
pgobj.setType("jsonb");
preparedStatement.setObject(1, pgobj);
Java的にはベンダー製パッケージのimportは
ちょっと抵抗がある
- 47. JPA (高レベルAPI)
SELECT / INSERT
Converterを作成すれば
SQLデータ型とJavaデータ型を相互変換できる
@Entity
@Table(name = "json_test")
public class JsonTest implements Serializable {
// ... 中略 ...
@Column(name = "info")
@Convert(converter = JsonbConverter.class)
private String info;
- 54. SQLAlchemy (高レベルAPI)
SELECT / INSERT
SQLAlchemyは至れり尽くせり。
各DBベンダー用方言(dialect)が用意されている。
from sqlalchemy.dialects.postgresql import JSONB
class JsonTest(Base):
__tablename__ = 'json_test'
id = Column(Integer, primary_key=True)
info = Column(JSONB) # JSONB型の列と宣言
...
- 57. 参考
• PostgreSQL 9.6.2文書
• PGCon2014 JSONB データ型を使ってみよう
• Oracle® Database SQL言語リファレンス
• MySQL 5.7 Reference Manual
• データ型 (Transact-SQL) - MSDN - Microsoft
• PostgreSQLのアンチパターン : 何でもかんでもjsonに入れる
• JPA 2.1 の 新機能 Converter まとめ
• Psycopg - PostgreSQL database adapter for Python
Notas del editor
- 例えば日付型を8桁の文字で保持するより、DATE型で保持したほうがよい
・不正な日付データ
・日付用の関数
・データサイズ
同じように自分がよく知らなかったデータ型もどんどん使えばいいのでは?
- ポスグレにはこんなにたくさんのデータ型があるんだよ!って言いたかったんだけど
- あらためてタイトルの紹介
- PostgreSQLはいち早く対応したが、最近のバージョンではmysql, sqlserverでもjsonが使えるようです。
Oracleは文字列データとして扱うがJSONとして検証するためのCHECK制約だけがあるっぽい。
- こっちのほうがいいです
特殊なケースを除いてjson → jsonbでOK
- 本の情報を保存しよう!
- 1列に複数の情報は入れるべきではない。原則
柔軟な補足データを格納する場合に検討。
・EAVパータン
・ジェイウォークパターン
- 開始<終了という挿入ルールだったり、CHECK制約があったはず。
- betweenでやってたこと
- getStringでJSON文字列が取得できる
- JDBC APIにはJSON型はない。
JDBCの提供するインターフェース経由で使うのが通常。PostgreSQL提供のドライバの機能を使うしかない。
アプリケーションのどこでも書くのではなく、共通ライブラリなど限定された箇所で使うべき。
- 文字列としてsetStringするので、標準APIのみで可能。
- JPAという仕様で、Converterが定義されているのでjsonb型ーStringの変換ができる
- Pythonの場合はORマッパー的なライブラリは標準APIになっていない
- Javaのときと同じようにPostgreSQL用ドライバが提供する機能でJson型をサポート
- Javaのときと同じようにJSON文字列を渡して、SQL文内で型変換する。
- カスタムデータタイプの機能が予めDBベンダー別に用意済み。