このサイトについて

TurboGears(SQLObject)のmodelに,列をダイナミックかつ自動的に追加する

TurboGears(SQLObject)のmodelに,列をダイナミックかつ自動的に追加する

TurboGearsはこの手の「自助努力的なハック」を活用することで使い勝手がどんどん増して行き,手に馴染んでゆくのが楽しい。ハッカーのためのフレームワークと言えますね:-)。

TurboGearsでアプリを開発中に,modelを変更したくなった場合。modelのクラスにアトリビュートを追加するわけだけど,その場合テーブルのDrop -> Createが必要だったりと,いまいち使いづらい。

modelに列を追加したら,データベース側にも列を追加できると何かと便利だ。以下のようなコードを使うことで,実現できる。

        # klassはSQLObject由来のmodelクラス
        # rowsには,modelに該当するテーブルに定義されている既存の列名の一覧をリストにして代入しておく
        # conはhub.getConnection()で得られるコネクションオブジェクト
        for key, col in klass._columnDict.items():
            # DB上の列名とクラス上のアトリビュートを比べる
            if col.dbName not in rows:
                # DB上に列がなかったので追加
                con.addColumn(table_name, col)

model.pyのトップレベルで上記コードを動かせば,modelを修正すると変更に追従してテーブルの定義を変更してくれるはず。XxxCol()の追加だけでなく,ForeignKeyの追加にも対応している(はず)。Joinに対応するためには,クラスメソッドの_getJoinsToCreate()なんかを使えばOK。

テーブルに定義されている列の一覧を得るための方法はDB依存なので,ここでは示さない。たいていはシステムテーブルとかそういう系統のデータをSQLでうねうねすると列の一覧を得られる。SQLObjectのソースの中にヒントとなるコードがある。

2010-08-27 04:41