テーブルそのものの操作方法(テーブル名変更・列の増減など)
一般的なデータベースでは、テーブルの列を増やしたりテーブル名を変更する時にはALTER TABLE文を使います。
ALTER TABLE table ADD ( new_column INT(10) )
ALTER TABLE文はサブコマンドに次のようなものがあります。
- ADD
- 列の追加
- MODIFY
- 列の名前やデータ長などの変更
- DROP
- 列の削除
- RENAME
- テーブル名の変更
しかしSQLiteのALTER TABLE文のサポートは限定的です。
ALTER TABLE
sql-statement ::= ALTER TABLE [database-name .] table-name alteration
alteration ::= RENAME TO new-table-name
alteration ::= ADD [COLUMN] column-def
定義を見ての通り、テーブル名の変更とカラムの追加しかできません。なによりバージョン3.1.3での実装のようです。
これ以外の操作や、もっと古いバージョンではどのようにしたらよいのでしょうか。
続きを読むActiveRecordの複数形処理
ActiveRecordは要素クラスの名前を複数形に変えてテーブル名としてくれるのですが、なんだか不思議な感じがします。
# Users テーブルへアクセス class User < ActiveRecord::Base end # People テーブルへアクセス class Person < ActiveRecord::Base end
Usersはわかるのですが、なぜPersonsにならないのだろう?
続きを読むActiveRecordはrequireに時間がかかる?
重い腰をあげてActiveRecordを実際にいじってみたのですが、これがずいぶん重たい。ちょっとした実験コードでも数秒固まります。
簡単に時間を計ってみると、mswin32でのrequireに8秒ちょっと(ActiveSupport 約5秒、ActiveRecord本体 約3秒)かかってるようですね…。
daemon動作させるならともかくCGIでは使えないかも。がっかり。
けれども、ぐぐってみても同様の評判は見あたりません。利用の大半がRuby on Rails環境とはいえ、利用者の数は十分多いはずなのですが。もしや環境依存?
xreaでも測ってみると、初回で約10倍、キャッシュに入ると約280倍(!)。これならCGIでも問題なさそうです。
mswin32では頻繁に起動するような使い方はせずに済むので、こちらもなんとでもなりそうです。でもなんでこんなにmswin32は遅いのだろう…?
以下に測定(と呼ぶには簡単すぎる方法ですが)の結果を載せておきます。
続きを読むPHP4 + SQLite3の基本的な使い方
SQLite2とSQLite3、PHP4とPHP5の組み合わせでごちゃごちゃしていて利用方法を探すに手間取ってしまいましたが、シンプルに利用することができました。
ここではPHP4とSQLite3の組み合わせを取り上げます。
<?php echo sqlite3_libversion(); // includeしているSQLiteそのもののバージョン $dbhandle = sqlite3_open("test.db"); ?>
これを実行して、./test.db が作成されれば OK です。
APIリファレンスはこちら。
php-sqlite3 : Main / API
HTMLエスケープしたHTMLタグがRSSリーダでHTMLエレメントになる
改行記法って不思議。のエントリではこのように記述してHTMLタグを表示させました。
ただインライン要素である<br>がブロック要素の<p>の外にぽつんとあるのは
しかしFirefoxのRSSプレビューやLivedoor Readerでは、このように表示されています。
ただインライン要素である がブロック要素の の外にぽつんとあるのは
エスケープしたはずのタグがHTMLとして解釈されてますね…。
はてなとRSSリーダ、どちらが悪いのだろう?*1
*1:大穴は「自分の記述ミス」:-)
net/httpの例外捕捉方法(2)
先日のNet::HTTPの例外補足方法、
rescue Timeout::Error
だけではエラーを捕捉しきれませんでした。*1
たしかErrnoの何かかEOFErrorだったはずなのですが、うっかりエラーメッセージを記録しわすれてしまったうえに、サーバの調子が悪い時にしかお目にかからないのでなかなか再現できません。
あれこれぐぐってみると、EOFErrorもErrnoも起きるような雰囲気。rescue Timeout::Error を指定するときには rescue もしくは rescue Exception の併用が欠かせませんね。
begin Net::HTTP.get(url) rescue puts "exception on HTTP: StandardError #{$!}" rescue Timeout::Error puts "exception on HTTP: TimeoutError" rescue Exception puts "exception on HTTP: #{$!}" end
2007/04/10追記
StandardError系とTimeout:Error以外の例外は通常のnet/httpでは出ないのかもしれません。もしそうならExceptionは「予期せぬ例外」になるので、もっと上位の部分(いわゆるmain関数やそれに近い所*2)で捕捉したほうが適切になりそうです。
後日もう少し調べてみます。
*1:当たり前といえば当たり前なのですが…。
*2:例えばHikiのhiki.cgi]のエラートラップのように