テーブルそのものの操作方法(テーブル名変更・列の増減など)

一般的なデータベースでは、テーブルの列を増やしたりテーブル名を変更する時には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

SQLite Query Language: ALTER TABLE

定義を見ての通り、テーブル名の変更とカラムの追加しかできません。なによりバージョン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タグを表示させました。

ただインライン要素である&lt;br&gt;がブロック要素の&lt;p&gt;の外にぽつんとあるのは

しかしFirefoxRSSプレビューやLivedoor Readerでは、このように表示されています。

ただインライン要素である
がブロック要素の

の外にぽつんとあるのは

エスケープしたはずのタグがHTMLとして解釈されてますね…。
はてなRSSリーダ、どちらが悪いのだろう?*1

*1:大穴は「自分の記述ミス」:-)

改行記法って不思議。

第一段落
二行目

第二段落


第三段落

と書くと、こんなHTMLになる。

<p>第一段落</p>
<p>二行目</p>
<p>第二段落</p>
<br>

<p>第三段落</p>

期待するのはこんな感じ。

<p>第一段落<br>
二行目</p>
<p>第二段落</p>
<p>第三段落</p>

(あれ、改行記法が行方不明に…)

互換性の問題で現在の仕様があるのでしょうけど、ただインライン要素である<br>がブロック要素の<p>の外にぽつんとあるのはなんだか不思議。*1

*1:この外に<div>があるので、HTMLとして間違ってるわけではありません

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]のエラートラップのように