ORMについて
ORM
ORM(Object-Relational Mapping) は、データベースとオブジェクト指向プログラミング言語の間の非互換なデータを変換するプログラミング技法です。
ORMは、リレーショナルデータベースに高レベルの抽象化を提供し、開発者がSQLの代わりにPythonコードを記述して、データベース内のデータとスキーマを作成、読み取り、更新、および削除できるようにします。 開発者は、SQLステートメントやストアドプロシージャを作成する代わりに、使い慣れたプログラミング言語を使用してデータベースを操作できます。
これは重要なことで、アプリケーションのコードの中に、SQLという別の言語を埋め込むことは保守性を大きく低下させることにもなります。
Pythonで実装されたORMはたくさんあります。次のものはそのうち代表的なものです。
巨大なコミュニティが多く圧倒的にメジャー
豊富の機能と多くのデータベースをサポート
拡張モジュールを使うことでデータベースマイグレーションができる
とても美しい実装で、拡張モジュールも多い
Webアプリケーションフレームワークとの親和性も高い
拡張モジュールを使うことでデータベースマイグレーションができる
サポートするデータベースが少ない
晴らしいORMで、Webアプリケーションとの親和性も高い
サポートするデータベースが少ない
Django ORM: Webフレームワーク Django に同包されるORM
PyDAL:WebフレームワークWeb2pyに同包されるORM 単独で利用可能 Firebird, Sybase, MSSQL, MaxDBなどもサポート
Tortoise:非同期I/OをサポートするORM。Django ORM に触発されて開発された。 Orator:シンプルでありながら美しいActiveRecord実装を提供 ActiveRecordは、プログラミングにおいてエンタープライズアプリケーションで頻繁に見られるデザインパターン
storm:Ubuntu をリリース保守をしている Canonical によって開発されたORM よく設計されたデザインで高速に動作する
長期的なメンテナンス性が提供されている
特別なクラスコンストラクタや必須のベースクラスを必要としないため学習コストが’低い
デバッグが容易
何を使えば良いの?
多くの種類のORMがあるなかで、どれをプロジェクトで採用すればよいのでしょうか?
次のような採用指針があると考えています。
使用するデータベースの種類
新規にデータベースを指定できるのか、既存データベースを利用する「必要」があるのか
リレーショナル・データベース、NoSQLデータベース、JSONファイル、YAMLファイル
保存するデータの種別と期間
画像や音声データなどのバイナリデータ、ドキュメント
キャッシュ目的での一時利用なのか、永続的な保存なのか
ORMを使用するアプリケーションの種類
Webアプリケーション、REST APIアプリケーション、コマンドラインツール
マイグレーション
データベースをマイグレーションをするかどうかC
スケーラビリティー
保存するデータ量、アクセス量
ほとんどのORMは、バックエンドのデータベースシステムとして、SQLite, MySQL/MariaDB, PostgreSQL の3つをサポートしてます。新規プロジェクトでデータベースシステムについての選択が自由なのであれば、どのORMも利用できます。
しかし、既存データベースシステムを利用することが必要なのであれば、そのデータベースシステムをサポートしていることが条件となりまず。
また、ただ単にデータをJSON形式のファイルに保存するだけでよい場合もあるかもしれません。そうした用途にデータベースシステムを利用することはオーバースペックになるはずです。
そうした判断ができるためにも、それぞれのORMについての知識があると便利です。
個人的には次のような選択肢を考えています。
プロジェクトでデータベースマイグレーションツールを使う必要がある
SQLAlchemy か Peewee
プロジェクトのデータベースで SQLite/PostgreSQL/MySQL(MariaDB)以外を使っている
SQLAlchemy
データベースシステムが使えない
datafiles, dataset, Bitzdb, SQLiteをバックエンドにした’ORM(Pony, Peewee, SQLAlchemy, SQLObject)
コンソールアプリケーションの內部で利用
datafiles, dataset
私が好きな ORM (好きな順)
Peewee > Pony > PyDAL > SQLAlchemy
次からは、具体的にORMについて説明してゆくことにします。