phpLiteAdminでALTER TABLEが失敗する場合の対処方法
昨日、「SQLiteのWeb管理ツールphpLiteAdminをインストールしてみた」でphpLiteAdminをインストールしたばかりですが、さっそくALTER TABLE文でハマりましたので、同じように悩んでいる方向けに対応策を残しておきます。
phpLiteAdminでALTER TABLE文が完全に無視されるケース
SQL文の例:
ALTER TABLE wp_posts ADD COLUMN newcolumn INTEGER
wp_postsテーブルにINTEGER型のnewcolumnという項目を追加するSQL文です。
一般的なSQL文ですし、SQLiteに限らずMySQL、PostgreSQL、SQLServer、Oracleなどでも普通に通る構文です。
そしてphpLiteAdminでもエラーは表示されないので、当然通ったものと思ったのですが、テーブルを確認したところ、新しいカラムが追加されていない…。
念の為、このSQL文をそのままSQLiteSpyで実行してみたところ、問題なく通ります。
なんでやねん。
phpLiteAdminでALTER TABLEを使う場合は項目名をダブルクォーテーションで囲む
phpLiteAdminでテーブルを選択した際、
SELECT * FROM "wp_posts" LIMIT 0, 30
というSQL文が実行されています。
ん、これはテーブル名や項目名をダブルクォーテーションで囲めということではないか、と考え、試しに先程のALTER TABLE文でテーブル名をダブルクォーテーションで囲むことにしました。
すると、こんなエラーが表示されます。
ALTER TABLE "wp_posts" ADD COLUMN "newcolumn" INTEGERERROR: Altering of Table wp_posts failed - ALTER action could not be recognized
ALTERアクションを認識できない…? ADD COLUMN がわからないってこと…?
この構文でエラーになったRDBMSを知らないので、混乱しました。
SQLiteSpyでは問題ないわけだし、phpLiteAdminの問題だよなぁ…。
ということで、phpLiteAdminのPHPスクリプトの中を見てみたところ、正規表現を使ってSQL文を自前で解析していることがわかりました。えー、なんでー…。
phpLiteAdminでADD COLUMNする際はCOLUMNを付けない
これ絶対ぼくと同じように困ってる人いるだろー、と思ってphpLiteAdminのフォーラムを漁ってみたところ、同じ話題がありました。
The following Syntax works:
ALTER TABLE "albums" ADD 'test' Integer
phpLiteAdmin currently is a little picky about the syntax of ALTER TABLE commands.
あー、なるほど………なるほどね!
SQLiteって、ALTER TABLE [tablename] ADD COLUMN [column]で項目の追加は出来るのに、DROP COLUMNによる項目の削除が出来ないらしいんですよ。
試しにSQLiteSpyでALTER TABLEを実行してみたのですが、たしかにADD COLUMNは通って、DROP COLUMNは弾かれます。
この問題を対処するためにphpLiteAdminではALTER TABLE構文を独自に解析し、
- ALTER TABLE [テーブル名] ADD [項目名] で項目の追加
- ALTER TABLE [テーブル名] DROP [項目名] で項目の削除
という動作をしてくれるのだそうです。
うわーなんという余計なお世話!w …と一瞬思いましたが、SQLiteでテーブルの項目を削除するには新しいテーブルを作り直すしかないとか。
となると、運用中のDBで項目の整理をしたくなった場合、
- 新しいテーブル作成
e.g. CREATE TABLE wp_posts_new - 現在のテーブルからデータコピー
e.g. INSERT INTO wp_posts_new SELECT * FROM wp_posts - 現在のテーブルを削除
e.g. DROP TABLE wp_posts - 新しいテーブル名を先程のテーブル名に変更
e.g. ALTER TABLE wp_posts_new RENAME TO wp_posts
なんて手順をしなければならず、どこかでひとつ間違えたら大変なことになります。
それをphpLiteAdminが肩代わりしてくれると考えると、余計なお世話とはとても言えなくなってきました。
まぁ、ADD COLUMNも通してくれよ、とは思いますがw
まとめ
- phpLiteAdminでALTER TABLEを使う際はテーブル名/項目名をダブルクォーテーションで囲む
- ADD COLUMNは使えないので、ALTER TABLE [テーブル名] ADD [項目名] という形式で書く
- 代わりに ALTER TABLE [テーブル名] DROP [項目名] で項目削除が出来る
といったところでしょうか。
phpLiteAdmin自体の情報が少なくて、なかなかハマりました。
ぼくのように今更SQLiteを活用しはじめた人で、かつphpLiteAdminを使うという奇特な人がこの記事を役立ててくださることを願います。