TurboGears: SQLObject Database Mapping Library
TurboGearsのサイトにあるSQLObjectドキュメント(http://www.turbogears.org/about/sqlobject.html)の超訳
SQLObject
Pythonを書くときに何でSQLまで書くの?
Pythonのような言語中のオブジェクトと、リレーショナルデータベース中のオブジェクトとでは、世界観が全く異なります。一般にORインピーダンスミスマッチと呼ばれる言葉もあります。オブジェクト指向でコードを書くときに、データベースに接続する必要があるときはいつもあなたの頭のギアをシフトしなければなりません。…いわゆるORマッパーを使わない限りは。
SQLObjectは、背後にデータベースが存在する事を隠しつつ、そのデータを標準的なPythonオブジェクトを通して利用することを可能にしてくれるORマッパーであり、簡単に利用する事ができます。アプリケーションにそれなりのパフォーマンスを持たせるためには、データベースの存在を忘れることはできません。テーブルをクラスに、カラムをアトリビュートにきれいにマッピングすれば、生成されるSQLに驚かされる事はないでしょう。SQLObjectのクエリロギングを見れば、どんなSQLが実行されたのかを正確に確認することがわかります。
SQLを手書きする事であなたは何を失っているのか
SQLを手書きする必要を低減してくれる・無くしてくれることに加えて、SQLObjectはさらなるアドバンテージをもたらしてくれます。
SQLObjectを使ってソフトウェアを開発しているなら、そのソフトウェアは自動的にデータベースから独立していることになります。例えばSQLiteでお手軽に開発する事から始めて、最終的にPostgreSQLを使って仕上げるということもできます。SQLObjectはMySQL、PostgreSQL、SQLite、Firebirdをカバーしています(部分的にはSybaseやOracleをサポートしていますが、これらはまだ不完全です)。
SQLObjectのアドバンテージはキャッシュにもあります。モジュラーコードによってかかれたアプリケーションがあるとき、あなたは1回の操作で同じクエリを複数回実行させることになるかもしれませんし、そんなことをする必要が無いか確認しながら自分のやり方を考えなければいけないかもしれません。SQLObjectはデータベースから得られたオブジェクトを自動的にキャッシュしますので、一回のリクエストで複数回データベースからオブジェクトを引っ張ってくるときであっても、結局データベースサーバにクエリがいくのは一回だけ、ということになります。
雑談はこのくらいにして、いくつかコードを見てみる
SQLObjectはどんなふうに機能するのでしょう?クラス定義はこんなふうです:
from sqlobject import *
from datetime import datetime
class Person(SQLObject):
firstName = StringCol(length=100)
middleInitial = StringCol(length=1, default=None)
lastName = StringCol(length=100)
lastContact = DateTimeCol(default=datetime.now)
そしてこれがMySQLでのステートメントです:
CREATE TABLE person (
id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(100) NOT NULL,
middle_initial CHAR(1),
last_name VARCHAR(100) NOT NULL,
last_contact TIMESTAMP NOT NULL
);
両者から一つの事に気づきます:Pythonでは、あなたが慣れ親しんだPythonオブジェクトを使えます。あなたがいつも通りNoneを使えば、データベースはNULLを受け取ります。あなたがdatetimeオブジェクトを使えば、データベースはdate/timeに適切なものを格納するのです。
これらのオブジェクトを使うにはどんなふうにすればいいのでしょう?もちろん、ただPythonのようにするだけです。
>>> p = Person(firstName="John", lastName="Doe")
>>> p
<Person 1 firstName='John' middleInitial=None
lastName='Doe' lastContact='datetime.datetime...)'>
>>> p.lastContact
datetime.datetime(2005, 9, 16, 9, 28, 7)
>>> p.firstName
'John'
>>> p.middleInitial = 'Q'
>>> p.middleInitial
'Q'
>>> p2 = Person.get(1)
>>> p is p2
True
SQLObjectはあなたのクラスに有用なメソッドを与えます。たとえば(一つのオブジェクトをそのIDによって得るための)「get」や(SQLのSELECTのPythonラッパーである)「select」のようなものです。また「set」のような有用なメソッドをあなたのインスタンスに与えてくれます(「set」はオブジェクトのアトリビュートの束をまとめて、データベースへの一つのUPDATEステートメントに変えます)。
SQLObjectを使い始めれば、これまでどうしてSQLを手書きしていたのだろうと思う事になるでしょう!
SQLObjectのスゲーところ
柔軟で、データベースから独立した、ORマッパーであるということ。
何がそんなにスゲーの?
SQLObjectはPythonオブジェクトを定義し、そしてデータベースを生成するためのすべてのSQLを自動的に生成し、必要ならばデータをinsert/update/deleteしてくれます。あるいは、データベースを定義して、そのデータベースに必要とされるPythonオブジェクトをSQLObjectに生成させることもできます。いずれにしろ、Pythonオブジェクトと同じくらい簡単にデータオブジェクトを操る事ができるのです。

