PostgreSQLでは、hstoreというハッシュ形式でデータを保存するデータ型があるようなので試してみました。
試したのは、Arch LinuxにインストールしたPostgreSQL 9.1.3です。
テスト用のデータベースとテーブルの作成
postgresユーザーになり、sampleというデータベースを作成。
psqlを起動し、使用するデータベースをsampleに変更します。
# su - postgres
$ createdb -E UTF8 -T template0 --lc-collate=ja_JP.UTF-8 --lc-ctype=ja_JP.UTF-8 sample
$ psql
postgres=# \c sample;
You are now connected to database "sample" as user "postgres".
初期状態では、hstoreを使用することはできません。
CREATE EXTENSION hstore
というクエリを実行して、hstoreを使用できるようにします。
sample=# CREATE EXTENSION hstore;
WARNING: => is deprecated as an operator name
DETAIL: This name may be disallowed altogether in future versions of PostgreSQL.
CREATE EXTENSION
idという数値型と、valueというhstore型のフィールドを持つtestテーブルを作成しました。
create table test (
id integer,
value hstore);
データの登録
"key" => "value"
という形式でデータを定義します。
もちろん、1フィールドに複数のkeyとvalueを保持できますので、カンマ区切りで複数のペアを
指定することができます。
とりあえず、こんなinsert文を実行して2レコードデータを登録しました。
insert into test (id, value) values (1, '"key1" => "v1_1", "key2" => "v1_2", "key3" => "v1_3"');
insert into test (id, value) values (2, '"key1" => "v2_1", "key2" => "v2_2", "key3" => "v2_3"');
何も考えずselectを実行してみると、一見そのまの文字列で登録されているように見えます。
sample=# select * from test;
id | value
----+------------------------------------------------
1 | "key1"=>"v1_1", "key2"=>"v1_2", "key3"=>"v1_3"
2 | "key1"=>"v2_1", "key2"=>"v2_2", "key3"=>"v2_3"
(2 rows)
where句に
[hstoreのフィールド名]->'[キー名]' = '条件'
という指定を行うことで、検索の絞り込みを行うことができます。
sample=# select * from test where value->'key1' = 'v1_1';
id | value
----+------------------------------------------------
1 | "key1"=>"v1_1", "key2"=>"v1_2", "key3"=>"v1_3"
(1 row)
sample=# select * from test where value->'key1' = 'v2_1';
id | value
----+------------------------------------------------
2 | "key1"=>"v2_1", "key2"=>"v2_2", "key3"=>"v2_3"
(1 row)
hstoreに使用できる関数
| 関数名 | 効果 |
| akeys(hstore) | 全てのキーをtext型の配列として返す |
| avals(hstore) | 全ての値をtext型の配列として返す |
| skeys(hstore) | 全てのキーを複数の行にして返す |
| svals(hstore) | 全ての値を複数の行にして返す |
| delete(hstore, keyname) | keynameをキーとする値を削除 |
| each(hstore) | キーと値を集合として返す |
一つずつ効果を見てみます。
akeys
sample=# select id,akeys(value) from test;
id | akeys
----+------------------
1 | {key1,key2,key3}
2 | {key1,key2,key3}
(2 rows)
キーのみのフィールドになりました。
avals
sample=# select id,avals(value) from test;
id | avals
----+------------------
1 | {v1_1,v1_2,v1_3}
2 | {v2_1,v2_2,v2_3}
(2 rows)
値のみのフィールドになりました。
skeys
sample=# select id,skeys(value) from test;
id | skeys
----+-------
1 | key1
1 | key2
1 | key3
2 | key1
2 | key2
2 | key3
(6 rows)
キーのみ、複数行となりました。
svals
sample=# select id,svals(value) from test;
id | svals
----+-------
1 | v1_1
1 | v1_2
1 | v1_3
2 | v2_1
2 | v2_2
2 | v2_3
(6 rows)
値のみ、複数行となりました。
delete
指定したhstoreフィールドから指定したキーを除外するという意味のようです。
sample=# select id, value from test;
id | value
----+------------------------------------------------
1 | "key1"=>"v1_1", "key2"=>"v1_2", "key3"=>"v1_3"
2 | "key1"=>"v2_1", "key2"=>"v2_2", "key3"=>"v2_3"
(2 rows)
sample=# select id, delete(value,'key1') from test;
id | delete
----+--------------------------------
1 | "key2"=>"v1_2", "key3"=>"v1_3"
2 | "key2"=>"v2_2", "key3"=>"v2_3"
(2 rows)
こんな感じで、delete(value, 'key1')とすることで、検索結果にkey1が表示されなくなります。
また、arrayを使用することで、複数のキーを指定することも可能です。
sample=# select id, delete(value,array['key1','key2']) from test;
id | delete
----+----------------
1 | "key3"=>"v1_3"
2 | "key3"=>"v2_3"
(2 rows)
これを踏まえ、id=1のhstoreからkey3を削除するには、以下のupdate文を実行すればOKです。
sample=# update test set value = delete(value, 'key3') where id = 1;
UPDATE 1
sample=# select * from test order by id;
id | value
----+------------------------------------------------
1 | "key1"=>"v1_1", "key2"=>"v1_2"
2 | "key1"=>"v2_1", "key2"=>"v2_2", "key3"=>"v2_3"
(2 rows)
キーが存在するかを条件に検索
上記のupdateを実行したことで、id=1のhstoreからkey3というキーがなくなりました。
hstoreにkey3が存在する列を検索したい場合は、「?」を使用すれば良いようです。
sample=# select * from test where value ? 'key3';
id | value
----+------------------------------------------------
2 | "key1"=>"v2_1", "key2"=>"v2_2", "key3"=>"v2_3"
(1 row)
JDBCドライバの対応
JavaからJDBCドライバで接続した時、hstoreがどう見えるか試してみたのですが、
どうも文字列として認識されるようです。
※十分に探しきれていないだけかもしれません。
Hstore PGObject classこちらを参考に(というかそのままですが)、PGhstoreクラスを作成しました。
- package org.postgresql.util;
- import java.io.Serializable;
- import java.util.Collection;
- import java.util.Set;
- import java.util.Iterator;
- import java.util.LinkedHashMap;
- import java.util.Map;
- /**
- * Class that handles hstore contrib datatype.
- */
- public class PGhstore extends PGobject implements Serializable, Cloneable, Map<Object, Object> {
- private final static long serialVersionUID = 1;
- private Map<Object, Object> hashList;
- public PGhstore() {
- setType("hstore");
- }
- public PGhstore(String value) throws java.sql.SQLException {
- this();
- setValue(value);
- }
- public PGhstore(Map<Object, Object> value) {
- this();
- hashList = new LinkedHashMap<Object, Object>(value);
- }
- @Override
- public void setValue(String s) throws java.sql.SQLException {
- hashList = new LinkedHashMap<Object, Object>();
-
- if (s == null) {
- return;
- }
-
- char[] chars = s.toCharArray();
- String key = null;
- StringBuffer buffer = new StringBuffer();
- boolean insideKey = true;
- boolean insideVal = false;
- boolean insideString = false;
- for (int i = 0; i < chars.length; i++) {
- // escape character that we need to skip
- if (chars[i] == '\\') {
- i++;
- }
- // white space
- else if (!insideString && Character.isWhitespace(chars[i])) {
- continue;
- }
- // the => between key and value
- else if (!insideString && chars[i] == '=') {
- i++;
- if (i == chars.length)
- throw new PSQLException("Unexpected end of string",
- PSQLState.DATA_ERROR);
- if (!insideKey || chars[i] != '>')
- throw new PSQLException(
- "Syntax error at position " + i,
- PSQLState.DATA_ERROR);
- insideKey = false;
- insideVal = true;
- key = buffer.toString();
- buffer.setLength(0);
- continue;
- }
- // quote, item separator or end of string
- else if (chars[i] == '"' || (!insideString && chars[i] == ',')
- || i == chars.length - 1) {
- if (chars[i] == '"') {
- insideString = !insideString;
- if (i != chars.length - 1)
- continue;
- } else if (chars[i] != ',' && buffer != null) {
- buffer.append(chars[i]);
- }
- String b = (buffer == null) ? null : buffer.toString();
- // end of element, add it to list
- if (b != null && (b.length() > 0 || insideVal)) {
- hashList.put(key, b.equalsIgnoreCase("NULL") ? null : b);
- }
- insideKey = true;
- insideVal = false;
- buffer = new StringBuffer();
- continue;
- }
- if (buffer != null) {
- buffer.append(chars[i]);
- }
- }
- }
- @Override
- public String getValue() {
- if (hashList == null) {
- return null;
- }
- Iterator<Entry<Object, Object>> iter = hashList.entrySet().iterator();
- if (!iter.hasNext()) {
- return null;
- }
- Entry<Object, Object> e = iter.next();
- StringBuffer buffer = new StringBuffer();
- appendEntry(buffer, e);
- while (iter.hasNext()) {
- e = iter.next();
- buffer.append(',');
- appendEntry(buffer, e);
- }
- return buffer.toString();
- }
- private void appendEntry(StringBuffer buf, Entry<Object, Object> e) {
- appendValue(buf, e.getKey(), true);
- buf.append("=>");
- appendValue(buf, e.getValue(), false);
- }
- private void appendValue(StringBuffer buf, Object v, boolean isKey) {
- if (v == null) {
- if (isKey)
- buf.append("\"NULL\"");
- else
- buf.append("NULL");
- return;
- }
- String s = v.toString();
- buf.append('"');
- for (int i = 0; i < s.length(); i++) {
- char c = s.charAt(i);
- if (c == '"' || c == '\\')
- buf.append('\\');
- buf.append(c);
- }
- buf.append('"');
- }
- public Collection<Object> values() {
- return hashList.values();
- }
- public int size() {
- return hashList.size();
- }
- public Object remove(Object key) {
- return hashList.remove(key);
- }
- public void putAll(Map<? extends Object,? extends Object> m) {
- hashList.putAll(m);
- }
- public Object put(Object key, Object value) {
- return hashList.put(key, value);
- }
- public Set<Object> keySet() {
- return hashList.keySet();
- }
- public boolean isEmpty() {
- return hashList.isEmpty();
- }
- public Set<Entry<Object, Object>> entrySet() {
- return hashList.entrySet();
- }
- public boolean containsKey(Object key) {
- return hashList.containsKey(key);
- }
- public Object get(Object key) {
- return hashList.get(key);
- }
- public boolean containsValue(Object value) {
- return hashList.containsValue(value);
- }
- public void clear() {
- hashList.clear();
- }
- }
こんなプログラムにすることで、hstoreをmapオブジェクトとして取り出すことができます。
- package com.fc2.blog68.symfoware.pg;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.Statement;
- import org.postgresql.util.PGhstore;
- public class Sample {
- public static void main(String[] args) {
- try {
- String url = "jdbc:postgresql://192.168.1.12:5432/sample";
- String user = "pguser";
- String pass = "pguser";
- Connection con = DriverManager.getConnection(url, user, pass);
-
- Statement stmt = con.createStatement();
-
- ResultSet rs = stmt.executeQuery("select * from test order by id");
-
- while(rs.next()) {
- System.out.print(rs.getString("id"));
- System.out.print("\t");
- PGhstore map = new PGhstore(rs.getString("value"));
- System.out.println(map.get("key1"));
- }
-
- stmt.close();
- con.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
実行結果
1 v1_1
2 v2_1
データの追加はこんな感じでしょうか。
- package com.fc2.blog68.symfoware.pg;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.Statement;
- import java.util.HashMap;
- import java.util.Map;
- import org.postgresql.util.PGhstore;
- public class Sample {
- public static void main(String[] args) {
- try {
- String url = "jdbc:postgresql://192.168.1.12:5432/sample";
- String user = "pguser";
- String pass = "pguser";
- Connection con = DriverManager.getConnection(url, user, pass);
-
- Statement stmt = con.createStatement();
-
- Map<Object, Object> javaMap = new HashMap<Object, Object>();
- javaMap.put("key1", "v3_1");
- javaMap.put("key2", "v3_2");
- javaMap.put("key3", "v3_3");
-
- PGhstore map = new PGhstore(javaMap);
-
- stmt.execute("insert into test (id, value) values (3, '" + map.getValue() + "')");
-
- stmt.close();
- con.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
ちゃんと登録されたようです。
sample=# select * from test order by id;
id | value
----+------------------------------------------------
1 | "key1"=>"v1_1", "key2"=>"v1_2"
2 | "key1"=>"v2_1", "key2"=>"v2_2", "key3"=>"v2_3"
3 | "key1"=>"v3_1", "key2"=>"v3_2", "key3"=>"v3_3"
【参考URL】
ログ解析にhstoreを利用してみようPostgreSQL hstoreでKVSF.16. hstoreHstore PGObject classPatch: Add support for hstore extension - and map it to/from java.util.Map- 関連記事
テーマ:データベース - ジャンル:コンピュータ
- 2012/05/16(水) 23:29:45|
- 備忘録
-
| トラックバック:0
-
| コメント:0
Arch LinuxにPostgresqlをインストール。
nginx + phpで接続できるようになりました。
Arch LinuxにPostgresqlをインストールするArch Linux + nginx + php-fpm + Postgresqlな環境を作成するせっかくなので、障害管理ツールのMantisを動かしてみます。
普段はMySQLで使用しているので、Postgresqlで動かすのは初めてです。
データベースの作成
データベースの文字コードを明示的に指定したかったので、Mantisで使用するデータベースを事前に作成しておきます。
rootでログインしている場合には、postgresユーザーになり、
createdbコマンドを実行して、データベースを作成します。
[root@(none) html]# su - postgres
[postgres@(none) ~]$ createdb -E UTF8 -T template0 --lc-collate=ja_JP.UTF-8 --lc-ctype=ja_JP.UTF-8 mantis
/etc/nginx/htmlに移動して、mantisbt-1.2.10.tar.gzをダウンロード。
ファイルを解凍して、mantisというフォルダにリネーム。
nginxのユーザーhttpにアクセス権を付与します。
# cd /etc/nginx/html
# wget -O mantisbt-1.2.10.tar.gz http://sourceforge.net/projects/mantisbt/files/mantis-stable/1.2.10/mantisbt-1.2.10.tar.gz/download
# tar xzf mantisbt-1.2.10.tar.gz
# mv mantisbt-1.2.10 mantis
# chown -R http:http ./mantis
http://[サーバーのIP]/mantis/にアクセスすると、データベース設定の画面が表示されます。
Type of DatabaseにPostgreSQLを選択。
PostgreSQLに接続するユーザー名とパスワードを入力し、Database nameに
先程作成したデータベースの名称を指定します。

下のInstallを押すと、さくっとインストール出来ました。
軽くプロジェクトの作成や案件の登録を行ってみたところ、どうも添付ファイルの
扱いに問題があるようで、添付したファイルが壊れてしまいました。

これに対応するため、保存先をデータベースからディスクに変更してみます。
mantisフォルダにあるconfig_inc.phpを編集。
$g_file_upload_method = DISK;という記載を追加します。
<?php
$g_hostname = 'localhost';
$g_db_type = 'pgsql';
$g_database_name = 'mantis';
$g_db_username = 'pguser';
$g_db_password = 'pguser';
$g_default_language = "japanese";
$g_file_upload_method = DISK;
?>
アップロードしたファイルを保存するため、適当なフォルダを作成します。
今回は、/etc/nginx/html/mantis/filesというフォルダを作成しました。
httpユーザーにアクセス権を付与します。
# mkdir /etc/nginx/html/mantis/files
# chown -R http:http /etc/nginx/html/mantis/files
mantisの[システム管理]-[プロジェクト管理]からプロジェクト名を選択すると、
[ファイルの登録場所]という項目が追加されているので、ここに先程作成したフォルダ名を指定し、
更新します。

これでファイルのアップロードが行えるようになりました。

【参考URL】
ファイルアップロード- 関連記事
テーマ:データベース - ジャンル:コンピュータ
- 2012/05/07(月) 23:06:06|
- 備忘録
-
| トラックバック:1
-
| コメント:0
Arch LinuxにPostgresqlをインストールしてみました。
Arch LinuxにPostgresqlをインストールするこのデータベースにphpから接続してみたいと思います。
nginx + php-fpm
以前、nginx + php-fpm + MySQLの環境を構築してみたことがあります。
Arch Linuxにnginx + php-fpm + mysqlの環境を作成するこれを参考に、nginx + php-fpmの環境を作成します。
pacmanでnginx、php-fpm、php-pgsqlをインストール。
# pacman -S nginx php-fpm php-pgsql
次に、php.iniを編集します。
# vi /etc/php/php.ini
編集するのは、
open_basedirに/etc/nginx/html/を追加。
extensionのpdo_pgsql.soとpgsql.soのコメントをはずし、有効にする。
という2箇所です。
#/etc/nginx/html/を追加
#open_basedir = /srv/http/:/home/:/tmp/:/usr/share/pear/
open_basedir = /etc/nginx/html/:/srv/http/:/home/:/tmp/:/usr/share/pear/
#コメントをはずして有効化
extension=pdo_pgsql.so
extension=pgsql.so
編集がおわったら、php-fpmを起動しておきます。
# rc.d start php-fpm
次は、nginx.confの編集です。
# vi /etc/nginx/conf/nginx.conf
編集箇所の抜粋は以下の通り。
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm index.php;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
try_files $uri =404;
root html;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
nginx.confの編集が終わったら、nginxを起動します。
# rc.d start nginx
phpinfoを表示させて動作確認します。
# vi /etc/nginx/html/info.php
内容はこんな感じ。
- <? phpinfo(); ?>
http://[サーバーIP]/info.phpにブラウザでアクセスするとphpinfoが表示されます。
pdo_pgsqlとpgsqlがちゃんと読み込まれてます。

簡単な接続サンプルを書いて、phpからPostgresqlに接続できるか試して見ました。
- <html>
- <head><title>PHP TEST</title></head>
- <body>
- <?php
- $conn = "host=localhost dbname=test user=pguser password=pwd";
- $link = pg_connect($conn);
- if (!$link) {
- die(pg_last_error());
- }
- print('Connect OK!<br>');
- pg_close($link);
- ?>
- </body>
- </html>
ちゃんと接続できているようです。

【参考URL】
NginxでのCakePHPサイト設置PostgreSQLへ接続- 関連記事
テーマ:データベース - ジャンル:コンピュータ
- 2012/05/07(月) 22:01:04|
- 備忘録
-
| トラックバック:1
-
| コメント:0
地味にハマったのでメモ。
PostgresqlでCSVファイルをテーブルに取り込むには、COPYを使うのが便利だとわかりました。
Postgresql 9.1でCOPYを使用し、csvファイルからデータをインポートする今回、お題として日本郵便で公開されている郵便番号データを
プログラムを使用せず、Postgresqlのテーブルに取り込んでみようと思います。
ただ、この郵便番号ファイルはShift-JISで、データベースはUTF8なんですよ。
unzipのインストール
最近知ったのですが、郵便番号データはlzhだけでなくzipでも公開されています。
今回は、Arch LinuxにインストールしたPostgresqlで試してみるので、
pacmanでunzipをインストールしておきました。
# pacman -S unzip
郵便番号データのダウンロードと展開
zip形式の郵便番号データはこちらで公開されています。
http://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html/tmpにダウンロードして、展開しておきます。
なお、ここからの作業はpostgresユーザーで行なっています。
$ cd /tmp
$ wget http://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip
$ unzip ken_all.zip
これで、/tmp/KEN_ALL.CSVというファイルができたかと思います。
作戦
ダウンロードしたファイルにはいろいろな情報が含まれています。
また、都道府県や市町村名、番地が別々のフィールドに入っています。
ファイルの形式は以下を参照。
http://www.post.japanpost.jp/zipcode/dl/readme.htmlここで考えた作戦が一旦テンポラリテーブルにCSVファイルをそのまま取り込み。
その後、ほしい形にSQLで整形しつつ一括インサート。
まず、CSVのレイアウトと同じ形式のテンポラリテーブルを作成します。
CREATE LOCAL TEMPORARY TABLE post_tmp (
全国地方公共団体コード int,
旧郵便番号 char(5),
郵便番号 char(7),
都道府県名カナ varchar(20),
市区町村名カナ varchar(100),
町域名カナ varchar(100),
都道府県名 varchar(20),
市区町村名 varchar(100),
町域名 varchar(100),
一町域が二以上の郵便番号 int,
小字毎に番地が起番 int,
丁目を有する町域 int,
一つの郵便番号で二以上の町域 int,
更新の表示 int,
変更理由 int
);
日本語名フィールドがそのまま通るので、あまり悩まずわかりやすいフィールド名が付けられますね。
次にこのテンポラリテーブルにcsvファイルからcopy。
COPY post_tmp FROM '/tmp/KEN_ALL.CSV' WITH encoding 'SJIS' CSV;
encodingオプションで'SJIS'をしていしてやります。
ポイントはCSVを指定するのですが、「FORMAT CSV」としないこと。
こんなエラーになります。
# COPY post_tmp FROM '/tmp/KEN_ALL.CSV' WITH encoding 'SJIS' FORMAT CSV;
ERROR: syntax error at or near "FORMAT"
LINE 1: ..._tmp FROM '/tmp/KEN_ALL.CSV' WITH encoding 'SJIS' FORMAT CSV...
これで、郵便番号の生データをPostgresqlに取り込むことが出来ました。
最終的にほしいテーブルの形式はこちら。
CREATE TABLE post (
郵便番号 char(7),
住所カナ varchar(500),
住所 varchar(500)
);
「郵便番号」
都道府県名カナと市区町村名カナと町域名カナを結合した「住所カナ」
都道府県名と市区町村名と町域名を結合した「住所」
post_tmpにいい感じでselectし、結果をそのままpostにinsertしてやります。
INSERT INTO post SELECT 郵便番号,都道府県名カナ || 市区町村名カナ || 町域名カナ, 都道府県名 || 市区町村名 || 町域名 FROM post_tmp;
Javaで適当にサンプルを書いて実行してみます。
- package com.fc2.blog68.symfoware.pg;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.Statement;
- public class Sample {
- public static void main(String[] args) {
- try {
- String url = "jdbc:postgresql://192.168.1.12:5432/test";
- String user = "pguser";
- String pass = "password";
- Connection con = DriverManager.getConnection(url, user, pass);
-
- Statement stmt = con.createStatement();
-
- ResultSet rs = stmt.executeQuery("select * from post where 住所 like '%銀座%'");
-
- while(rs.next()) {
- System.out.print(rs.getString("郵便番号"));
- System.out.print("\t");
- System.out.print(rs.getString("住所カナ"));
- System.out.print("\t");
- System.out.println(rs.getString("住所"));
- }
-
- stmt.close();
- con.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
実行結果は狙い通り。
0691331 ホッカイドウユウバリグンナガヌマチョウギンザ 北海道夕張郡長沼町銀座
3220052 トチギケンカヌマシギンザ 栃木県鹿沼市銀座
3600032 サイタマケンクマガヤシギンザ 埼玉県熊谷市銀座
3670052 サイタマケンホンジョウシギンザ 埼玉県本庄市銀座
1040061 トウキョウトチュウオウクギンザ 東京都中央区銀座
9300991 トヤマケントヤマシシンジョウギンザ 富山県富山市新庄銀座
3940022 ナガノケンオカヤシギンザ 長野県岡谷市銀座
3940023 ナガノケンオカヤシヒガシギンザ 長野県岡谷市東銀座
3950031 ナガノケンイイダシギンザ 長野県飯田市銀座
4240817 シズオカケンシズオカシシミズクギンザ 静岡県静岡市清水区銀座
4130013 シズオカケンアタミシギンザチョウ 静岡県熱海市銀座町
4140028 シズオカケンイトウシギンザモトマチ 静岡県伊東市銀座元町
4750874 アイチケンハンダシギンザホンマチ 愛知県半田市銀座本町
4480845 アイチケンカリヤシギンザ 愛知県刈谷市銀座
5220088 シガケンヒコネシギンザチョウ 滋賀県彦根市銀座町
6128089 キョウトフキョウトシフシミクギンザチョウ 京都府京都市伏見区銀座町
7450032 ヤマグチケンシュウナンシギンザ 山口県周南市銀座
7450033 ヤマグチケンシュウナンシミナミギンザ 山口県周南市みなみ銀座
7700916 トクシマケントクシマシギンザ 徳島県徳島市銀座
8040076 フクオカケンキタキュウシュウシトバタクギンザ 福岡県北九州市戸畑区銀座
【参考URL】
PostgreSQL CSVファイルからのインポートhttp://www.postgresql.jp/document/current/html/sql-copy.htmlPostgreSQL の COPY コマンドと SQL だけで様々なデータをインポートする- 関連記事
テーマ:データベース - ジャンル:コンピュータ
- 2012/05/06(日) 19:41:18|
- 備忘録
-
| トラックバック:1
-
| コメント:0