Personal tools

100行ちょっとのやる気のないPython製O/Rマッパー


戯れにO/Rマッパーを作ってみた。SQLite3決めウチのO/RマッパーならPythonを使えば100行ちょっとで書けてしまうんだよなあ。まあエラー処理とかまったく考えてないけどね。

こんな風に使う。

まずはクラスを定義してテーブルを作る。手抜きなのでカラム名とデータ型をタプルで並べて定義する。個々のデータを識別するため,テーブルには勝手にidというカラムを追加する。

 >>> from simplemapper import BaseMapper
 >>> class TestORClass(BaseMapper):
 ...    rows=(('num', 'int'), ('body', 'text'))
 ...
 >>> TestORClass.createtable()

INSERT = インスタンスを作る。

 >>> for i in range(10):
 ...     ins=TestORClass(num=i, body='body'+str(i))
 ... 

idを指定してインスタンスを生成すると,既存のデータをデータベースから取ってくる。ちみなに,UPDATEはアトリビュートを書き換えてからupdate()メソッドを呼ぶようになっている。

 >>> ins=TestORClass(id=1)
 >>> ins
 <TestORClass:num=0, body=u'body0'>
 >>> ins.num=100
 >>> ins.body=u'body100'
 >>> ins.update()

次はSELECTね。DjangoのO/Rマッパー風に,キーワードで条件を指定する。ちなみにSQLObjectとかSQLAlchemyとかでは,演算子のオーパーライドをしているので「boo==1」みたいに書くことができる。

 >>> for ins in TestORClass.select(num_gt=5):
 ...     print ins
 ... 
 <TestORClass:num=100, body=u'body100'>
 <TestORClass:num=6, body=u'body6'>
 <TestORClass:num=7, body=u'body7'>
 <TestORClass:num=8, body=u'body8'>
 <TestORClass:num=9, body=u'body9'>

ソースは以下。結局やってることは文字列の切り貼りなんだけど,どこで何をやるのかってのが設計のミソなのかなあ。

あとパフォーマンスとかを考えるともっと別の実装があるはず。そこまで考えると100行ちょっとじゃ済まないですね。

simplemapper.py simplemapper.py
Size 5.1 kB - File type text/python-source
Category(s)
python
The URL to Trackback this entry is:
http://coreblog.org/ats/140-lines-poor-python-or-mapper/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