■ 初めに
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