RDBを移行した時のメモ

2007/4/25 更新

 Zope + ZODBCDA + JET DB(MS Accesss)から、Zope + KInterbaseDA + Firebird 1.0.3 に RDBを移行した時のメモです。

1.Firebirdでは、表名を書けるところに SELECT 文が書けない

 (2007/4/25 追記 Firebird 2.0 以降ではできるみたいです)

 例えば

SELECT A.a1, A.a2, B.b1 FROM A, B

の、A B の代わりに SELECT 文を置けません。以下が、ダメな例です。

SELECT A.a1, A.a2, B.b1 FROM A, (SELECT c.b1, c.b2 FROM C WHERE c.foo='bar') B

同様に、以下の例もエラーになりました。

SELECT A.a1, A.a2, B.b1 FROM A
        LEFT JOIN (SELECT c.b1, c.b2 FROM C WHERE c.foo='bar') B
        ON A.a1 = B.b1

 しかし、A、B、Cが表名(or View名)であれば、以下のような INNER JOIN と OUTER JOIN の組み合わせは記述できます。

SELECT A.a1,  B.b1, C.c1 FROM A, B
        LEFT JOIN C ON B.w = C.x
        WHERE A.y = B.z

 

2.KInterbaseDA では、SQL Methodで、複数の SQL文が実行できない

  KInterbase DA では、<dtml-var sql_delimiter> で区切って、複数の SQL文を1つの ZSQLMethod で実行することができませんでした。

3.テーブル名、カラム名に使えないキーワードがある

 Firebird では、表名、列名に UserValuePassword が使えませんでした。

4.日付を比較する時の記述フォーマットの違い

 JET DB では、SQL文に記述する日付式は #YYYY/MM/DD# ですが、Firebird では 'YYYY-MM-DD' と書きます。

5.日付型の列を取得した時の表示形式の違い

 日付型のデータを SELECT し、<dtml-var datevalue> と DTMLに書くと JET DB では、2003/06/14 と表示されますが、Firebird では  2003-06-14 13:00:00.00 とレンダリングされてしまいます。

 以下のような PythonScriptを書き、DTML に <dtml-var "date_to_string(datevalue)"> と記述することにより、日付部分のみを表示するようにしました。

ScriptName: date_to_string
Parameter List: date 
strdate = str(date)
return strdate[0:4] + "/" + strdate[5:7] + "/" + strdate[8:10]

 

6.オートナンバー型の取り扱い

 JET DBでは、オートナンバー型という、行を挿入するごとに自動採番される列を指定することができますが、Firebird では、トリガーとジェネレーターで同様のことがなされるようにできます。

具体的には、以下のような SQL文で、表 same_table の列 some_id が、自動的に 10000から採番されます。

create generator gen_some_id;
set generator gen_some_id to 10000;
set term !! ;
create trigger set_some_id for some_table
before insert
as begin
new.some_id = gen_id(gen_some_id,1);
end
!!
set term ; !!

 


Zope メモ