pg_bulkload(PostgreSQL 向けの高速データロードユーティリティ)には,独自のバイナリフォーマットがあります.
公式ドキュメントに,pg_bulkloadの使い方が載っていますが,バイナリファイルを出力するためのサンプルとなる制御ファイルはありません.
そこで本ページでは,CSVファイルをpg_bulkloadのバイナリフォーマットに変換するための制御ファイルを紹介します.
想定するロード先テーブル
Table "public.users"
Column | Type | Modifiers
--------+-------------------+-----------
name | character varying |
age | integer |
weight | real |
サンプルCSVファイル
input.csv
"taro",17,55.0
"jiro",15,53.0
"saburo",13,45.0
サンプル制御ファイル
output_binary.ctl
# 入力はCSVファイル
TYPE = CSV
# 標準入力から読み込む
INPUT = stdin
WRITER = BINARY
OUTPUT = /tmp/test.bin
# カラムの型情報をOUT_COLで指定する
OUT_COL = VARCHAR(10)
OUT_COL = INTEGER(4)
OUT_COL = FLOAT(4)
コマンド
$ pg_bulkload output_binary.ctl < input.csv
NOTICE: BULK LOAD START
NOTICE: BULK LOAD END
0 Rows skipped.
3 Rows successfully loaded.
0 Rows not loaded due to parse errors.
0 Rows not loaded due to duplicate errors.
0 Rows replaced with new rows.
出力
$ od -c /tmp/test.bin
0000000 t a r o 021 \0 \0 \0 \0 \0
0000020 \ B j i r o 017 \0 \0 \0
0000040 \0 \0 T B s a b u r o \r \0
0000060 \0 \0 \0 \0 4 B
0000066
/tmp/test.bin.ctl
INPUT = /tmp/test.bin
OUTPUT = test
LOGFILE = /tmp/test.bin.log
PARSE_BADFILE = /tmp/test.bin.prs
DUPLICATE_BADFILE = /tmp/test.bin.dup
PARSE_ERRORS = INFINITE
DUPLICATE_ERRORS = 0
ON_DUPLICATE_KEEP = NEW
SKIP = 0
LIMIT = INFINITE
CHECK_CONSTRAINTS = NO
MULTI_PROCESS = YES
VERBOSE = NO
TRUNCATE = NO
WRITER = DIRECT
TYPE = BINARY
COL = VARCHAR (10)
COL = INTEGER (4)
COL = FLOAT (4)
# ENCODING = SQL_ASCII