【Ant】【PostgreSQL】 Ant で、DB を 初期化する ~ PostgreSQL編 ~

  ■ 初めに

http://blogs.yahoo.co.jp/dk521123/34993017.html
を使えば、DB を 初期化できるかと思ったが、
DROP DATABASEを行った際に、
エラー「cannot drop the currently open database」等が表示されるが出たので、
別のアプローチを行って実現する

 

  ■ 実現方法

http://blogs.yahoo.co.jp/dk521123/33982442.html
で記載した「pdqlコマンド」で、DB を 初期化するSQL文と
それを実行するシェル(Windowsならバッチ)を用意し
http://blogs.yahoo.co.jp/dk521123/33973954.html
で記載した「execコマンド」で、このシェルをAntで実行する

 

  ■ サンプル

  build.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="init.db" name="SampleCodes">
    <target name="init.db">
    	<exec executable="./etc/InitDb.sh" failonerror="yes" />
    </target>
</project>

  InitDb.sh

* InitDb.sh は実行権限を付与しておくこと(下記の注意を参照のこと)
#!/bin/bash

# hostname:port:database:username:password
echo "localhost:5432:*:postgres:postgres" > $HOME/.pgpass
echo "localhost:5432:*:admin:admin" >> $HOME/.pgpass

chmod 600 $HOME/.pgpass

psql -f ./etc/InitDb.sql -p 5432 -q -U postgres -h localhost

  InitDb.sql

DROP DATABASE IF EXISTS sampledb;

DROP USER IF EXISTS admin;
CREATE USER admin WITH PASSWORD 'admin' CREATEDB;

CREATE DATABASE sampledb
  WITH OWNER = admin
       ENCODING = 'UTF8';
\c sampledb admin

DROP TABLE IF EXISTS person;

CREATE TABLE person
(
  id character(8) NOT NULL,
  name character varying(100),
  sex character(1),
  updatedate timestamp without time zone,
  CONSTRAINT person_pkey PRIMARY KEY (id)
);
ALTER TABLE person
  OWNER TO admin;

INSERT INTO person(
            id, name, sex, updatedate)
    VALUES ('X0000000', 'admin', 'm', Now()),
           ('X0000001', 'Mike', 'm', Now()),
           ('X0000002', 'Tom', 'm', Now());

  出力結果

Buildfile: /home/admin/workspace/SampleCodes/build.xml
init.db:
     [exec] DROP DATABASE
     [exec] DROP ROLE
     [exec] CREATE ROLE
     [exec] CREATE DATABASE
     [exec] データベース "sampledb" にユーザ"admin"として接続しました。
     [exec] DROP TABLE
     [exec] CREATE TABLE
     [exec] ALTER TABLE
     [exec] INSERT 0 3
     [exec] psql:./etc/InitDb.sql:11: NOTICE:  table "person" does not exist, skipping
     [exec] psql:./etc/InitDb.sql:20: NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "person_pkey" for table "person"
BUILD SUCCESSFUL
Total time: 1 second

 

  ■ 注意

 * InitDb.shに、実行権限を付与しておかないと、以下のようなエラーが表示される

  エラー内容

Buildfile: /home/dk/workspace/SampleCodes/build.xml
init.db:

BUILD FAILED
/home/dk/workspace/SampleCodes/build.xml:5: Execute failed: java.io.IOException: Cannot run program "./etc/InitDb.sh": error=13, 許可がありません

Total time: 555 milliseconds

  解決策

chmod 777 ./etc/InitDb.sh

 

  関連記事

  Ant で、SQL を実行する

http://blogs.yahoo.co.jp/dk521123/34993017.html

  ファイルからSQL文を一括で実行するには ~pdqlコマンドの利用~

http://blogs.yahoo.co.jp/dk521123/33982442.html

  Ant で、Javaコンパイル / Javaの実行 / バッチ・シェルの実行 を行う

http://blogs.yahoo.co.jp/dk521123/33973954.html