Personal tools

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のソースの中にヒントとなるコードがある。

Category(s)
python
The URL to Trackback this entry is:
http://coreblog.org/ats/add-row-in-sqlobject-model-dynamically/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
コメントスパム避けのための認証文字列です

Captcha Image

Pythonな求人
r = urlopen("http://www.webcore.co.jp/recruit")
About this blog
■Author
atsこと柴田淳です。Atsushiはガイジンにうまく発音して頂けないので,これからはJunというペンネームで行こうと思っていましたがあんまり使ってません。
Webcore株式会社 代表取締役
■TRIVIAL TECHNOLOGIES 2.0
トリビアル・テクノロジー 2.0,「トリテク 2.0」と呼んでください。
Blog(ブログ)サイトです。Plone上で動く,オープンソースのBlog Product - COREBlog2を使っています。
 
最近書いた本,Mook
みんなのPython Webアプリ編
Pythonの基礎から,Webアプリやフレームワークの仕組みまで,つまることなく一気に学べる書籍です。「みんなのPython」と一緒に読んでください:-)。
みんなのPython
Pythonの入門書です。基本的なことから分かりやすく解説するよう勤めました。Pythonをはじめたいと思っている人,JavaやC++,PerlやRubyを学ぼうと思って躓いてしまった人はぜひ読んで下さい。
 

Powered by Plone, the Open Source Content Management System