[CentOS6] Postgresqlで、テーブルにcsvデータをインポート | PCマニアときどきアウトドア

PCマニアときどきアウトドア

忘れっぽいので備忘録として記録することにしました

CentOSicon
 自分向けマニュアルとして、postgresqlで、ユーザ、DB、テーブル作成からcsvインポートまでを書いておく。同一名のPostgresqlユーザ、CentOSユーザを作成するので、混乱に注意。

今回の環境
CentOS 6.5
Postgresql 9.3

 自動で作成されるユーザー「postgres」へログイン。

$ su - postgres

 Postgresqlユーザ(ロール)を作成。DBログインしていない状態で行う。

bash-4.1$ createuser hoge

 DBへログイン。

bash-4.1$ psql

 今回はhogeユーザーにデータベース作成権限を与え、ユーザー作成権限は与えない。ファイル経由のコピー(CSVからのインポート)をするためにSuperUserとする。

postgres=# ALTER ROLE hoge SUPERUSER CREATEDB NOCREATEUSER;
「ALTER ROLE」と表示されたらOK(最後のセミコロン「;」を忘れずに)。

 パスワードを設定、変更する場合は以下を実行する。データベースへの接続にパスワードログイン認証を行うには、pg_hba.confに"password"や"md5"の設定がされている必要がある。

postgres=# ALTER ROLE hoge WITH PASSWORD 'パスワード文字列';

 DB及びユーザpostgresからログアウト。

postgres=# \q

bash-4.1$ exit

 続いてDB用CentOSユーザー作成。Postgresqlのユーザーと名前を合わせておく。このユーザでログインしなければいけないので、nologinにはしない。

$ useradd hoge

$ passwd hoge
 パスワードを聞いてくるので入力する。

 作成したユーザーへsu。

$ su - hoge

 DBを作成し、ログイン。

hoge$ createdb mydb

hoge$ psql mydb

 テーブルを作成。「カラム名(スペース)型」をカラムごとにカンマで区切って入力する。主キーには「(スペース)PRIMARY KEY」を追加する。最後のセミコロンを入力するまでは、改行しても続き文として認識される。

mydb=# CREATE TABLE mytable(column1 type, column2 type PRIMARY KEY, column3 type);

確認系及び終了コマンドは次の通り。
DB確認・・・「\l」
テーブル確認・・・「\d」
カラム確認・・・「\d mytable」
終了・・・「\q」

 続いてcsvからデータをインポートする。
 どこでも良いが、今回は/home/hoge/にインポートしたいcsvを置く(例としてファイル名"a.csv"とする)。
 必要に応じてUTF-8へエンコード。エンコードにはnkfを使うので、ない場合yum install nkfでインストールしておく。
 読み取り許可が必要なので、ホームディレクトリのパーミッション設定をする(DB単独で動かすなら744でもいいかも知れない。このディレクトリでphpを実行する予定があったので、今回は755とした)。

root$ chmod 755 /home/hoge

root$ su - hoge

hoge$ nkf -w --overwrite a.csv

hoge$ psql mydb

mydb=# TRUNCATE mytable;  ←mytableのレコード全件削除。全件置換の時など必要に応じて実行。
mydb=# COPY mytable FROM '/home/hoge/a.csv' WITH CSV;  ←csvよりレコードインポート。
 インポートした行数が表示される。

 あとはSELECTなりUPDATEなりSQL文をうてば、いい感じに結果が返ってくるはず。
 以上。