2016年05月04日
_ [computer] PostgreSQL(ver.9.5) on Windows10 と Javaからの接続 (私的備忘録)
休みが続いているので、久しぶりにプログラミングの勉強。Webアプリからデータベースを使うので、以前も使用していて慣れているPostgreSQLのWindows版(Ver9.5)を、Win10の上にインストール。流石に最近では、インストールもとても楽。
Windows版だけかも知れないけど、別に新しいユーザアカウントなど作らなくても大丈夫みたい。普通にインストールすると、postgres名のユーザーで、データベースにアクセス出来る。(パスワードはインストール時に設定)
インストール後はデータベースは自動的に起動している。psqlの起動には、インストール時にスタートメニューに登録されるpsqlからでも良いし、
C:\Program Files\PostgreSQL\9.5\binで
> psql -U postgres
でもOK
インストール時にデータベースtemplate1他が出来ているもよう。新たなデータベース作成は
> createdb -U postgres xxxx
試しに、以前作った郵便番号用のテーブルzipadrを流用して、新しいテーブルを作成しデータを読み込んでみる。NetBSD上でのPostgreSQLで使ったテーブル作成のファイル"zipadr.tbl"を引っ張ってきて、少し修正してからテーブル作成
# \i zipadr.tbl
郵政提供の郵便番号データKEN_ALL.CSV自体は、色々問題があって使いづらいので、若干加工された物を使用。「zipcloud(http://zipcloud.ibsnet.co.jp/)」から、加工済みのデータ、x-ken-all*.zipをダウンロードして、x-ken-all.csvを使用。
psqlからCOPYコマンドで、この郵便番号データを読み込む。以前はそのままcsvを読み込めなかったので、Cで自作のフィルターを作り、更にnkfで漢字コードで変換してから読み込ませていたのだけど、検索してみると、最近のPostgreSQLではCOPYコマンドで、オプション指定すればそのまま読めるみたいだ。漢字コードもいちいち変換しなくても良いみたいで、とても便利になった。
# COPY zipadr FROM 'D:/xxxxx/ken-all.csv' WITH ENCODING 'SJIS' CSV ;
ファイル名はフルパス推奨
ken-all.csvはShift-JISのcsvなので、オプション、ENCODING 'SJIS' CSVを指定する。
COPY文のマニュアルには、'encoding_name'の内容が書かれていないけど、Shift-JISは'SJIS'の様。また私がそのマニュアルを読む限りでは、csvの読み込みのオプションは"FORMAT csv"だと思うのだけど、これでは駄目で(エラーになる)、単にCSVと並記すると上手く行く。何か不思議だけど、それでちゃんとインポート出来ている。
続いてJavaから、このPostgreSQLのデータベースへ接続してみる。まずはPostgreSQLのJDBCライブラリのダウンロードと登録が必要。
"PostgreSQL JDBC website"からドライバ"postgresql-9.x.xxxx.jar"をダウンロード。私はNetBeansを使っているので、プロジェクトの中のライブラリを右クリックして、「JAR/フォルダの追加」から、このドライバを登録する。(NetBeans使うならMySQLにした方が良いかも、だけど、昔々、フリーのデータベースを選ぶときにPostgreSQLにしてしまったので、他のに乗り換える気がしない。ちなみに選んだ理由は、「当時データベースはPostgreSQLの本が一番沢山出ていたから」です、今は殆どMySQLしか出ていないですね。)
プログラム中ではまずインポート文を追加
import java.sql.* ;
データベースへの接続はDriverManagerクラスのgetConnectionでするらしいので、こんな感じ
String driverUrl = "jdbc:postgresql://localhost:5432/database-name";
Connection con = DriverManager.getConnection(driverUrl,"postgres","password");
ポート5432はPostgreSQLのデフォルト。ローカルでの接続なので、データベースの方も、インストール時の設定のままで接続できた。SQLの実行はこんな感じ、、
String sql = "SELECT * FROM zipadr WHERE zip7 = '0000000'" ;
ResultSet rs = stmt.executeQuery(sql);
基本は概ね本に書いてある通りなんだけど(本ではJavaDB)、こういうガイド本でも読んでその通りにしないと、どのクラスのどのメソッドを使うとか、すぐには分からないよねぇ。