雑文発散

«前の日記(2012-05-13) 最新 次の日記(2012-05-18)» 編集
過去の日記

2012-05-16 [長年日記]

[MySQL][PostgreSQL] MySQL のテーブルを PostgreSQL に移植する

MySQL ベースにいつの間にかなっていた CandyCane を PostgreSQL で動くようにしてみている。元々が MySQL と PostgreSQL に両対応している Redmine (Rails) のデータ構造であり、同じく両対応している CakePHP で使うことを前提としているので、そんなに特殊なものじゃないという前置き。

MySQL でダンプされたデータには「5.1.30」とあったので、たぶんこのバージョンの MySQL を利用。移植先は PostgreSQL は 9.1.3 を利用している。

#MySQLPostgreSQL備考
1CREATE TABLE IF NOT EXISTS `attachments` ( 略 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;CREATE TABLE attachments ( 略 );PostgreSQL 9.1 以降なら IF NOT EXISTS 入りでも OK。ENGINE などはガッツリ削除。テーブル名のバッククォートも削除。
2`id` int(11) NOT NULL AUTO_INCREMENTid SERIAL NOT NULLAUTO_INCREMENT は SERIAL で代替。カラム名のバッククォートは削除。以降の行はカラム名省略。
3int(11) NOT NULL DEFAULT '0'INTEGER NOT NULL DEFAULT 0数値のゼロなのであえて '0' にはしない
4varchar(30) COLLATE utf8_unicode_ci NOT NULL DEFAULT ''VARCHAR(30) NOT NULL DEFAULT ''COLLATE は無視。VARCHAR の数値はそのまま。
5datetime DEFAULT NULLTIMESTAMP DEFAULT NULLTIMESTAMP 型に変更
6tinyint(1) NOT NULL DEFAULT '0'INTEGER NOT NULL DEFAULT 0Rails 的には tinyint(1) を BOOLEAN 的に使っているとか?(要出展)。今は INTEGER にしてしまっているが、PostgreSQL 的には BOOLEAN が正しい?
7CREATE TABLE IF NOT EXISTS `boards` ( 略 KEY `boards_project_id` (`project_id`)) 略CREATE TABLE boards ( 略 ); CREATE INDEX boards_project_id ON boards (project_id);CREATE TABLE 内の KEY は、外出しして CREATE INDEX へ変換。
8text COLLATE utf8_unicode_ciTEXTCOLLATE は無視
9CREATE TABLE IF EXISTS `sample` ( `id` int(11) NOT NULL AUTO_INCREMENT); INSERT INTO `sample` VALUES (1);CREATE TABLE sample (id SERIAL NOT NULL); INSERT INTO sample VALUES (nextval(`sample_id_seq`));INSERT時にSERIAL用のシーケンスを利用する必要がある。
10INSERT INTO `roles` ( permissions ) VALUES ('--- \n- :add_issues\n');INSERT INTO roles ( permissions ) VALUES ('---
- :add_issues
');
PostgreSQLでは '\n' は改行ではなく \n という文字なので、本当の改行を入れてやる。
11dateDATEそのまま

今回やってみたのはだいたいこんなところ。

ORM 経由での DB アクセスなので、テーブル構造だけ移植すれば修正すればいいかなと思ってたけど、うまく動かない箇所もあった。そこは CakePHP の ORM ではうまく表現できないところみたいで、生 SQL が書かれていた。その辺のアプリケーション部分の修正をしたところ、なんとなく CandyCane を PostgreSQL 9.1.3 で動かせたんじゃないかと思ってる。まだ全然詳細まで動作確認していないので、残りものが多数ありそうだけど(笑)

本日のツッコミ(全2件) [ツッコミを入れる]
kaz29 (2012-05-17 11:08)

PostgreSQLの booleanだと数値の0/1を受け付けてくれないのが悩ましいですね

すずき (2012-05-17 13:14)

そこら辺はフレームワーク側で意図しているデータ形式にするのが正しいのかなとか思い始めました。 CakeSchema で 'type' => 'boolean' として利用されるデータ形式に合わせるのかな、とか。