【Djangoから】変換ライブラリ d2a のご紹介【SQLAlchemyへ】
2018-07-06

目次

Prehistory (経緯)

Django のモデルも作って SQLAlchemy のスキーマも定義するのって すごく冗長でやる気が削がれますし、管理も大変です。

ということで d2a という一括生成ライブラリを作りました。

初回リリース以降、ユニットテストとかが不完全だったんですが

ようやくちゃんとユニットテストがかけたので先日 1.0.0 としてリリースしました 🎉

Usage (使い方)

$ pip install d2a

使い方はかんたんで、 models.py と同じディレクトリに 以下のような記述をしたモジュール(例えば models_sqla.py)を配置するだけです。

from d2a import transfer
from . import models
transfer(models, globals())

あとはこのモジュールを import すると sqlalchemy の ORM オブジェクトが Django Model と同じ名前で取得できます。 元の Django Model にては加えないので副作用はないです。

備考

M2Mフィールドによって自動作成された中間テーブルは パスカルケース 名で出力されます。

たとえば、 Book から Category に対して張られた M2M フィールドから生成されたモデルなら BookCategory となります。

もしカスタムフィールドを使用している場合、 alias 関数を使って登録してあげれば対応できます。

たとえば、 ImageField を継承した SuperImageField というフィールドを使っているとしたら、 transfer 関数を呼び出す前に 以下を実行します

from d2a import alias
alias(SuperImageField, ImageField)

こうすることで、 ImageField と同じ変換ルールで フィールドが定義されます。

備考

SQL Expression オブジェクトは ORMオブジェクトの .__table__ から取得できますが、

「SQL Expression しか使わない」という場合は transfer 関数に as_table=True を指定するとすべて、 SQL Expression Schema オブジェクト として出力されます。

Demo

端末 に Docker (docker-compose) がインストールされている場合、以下のような手順で手元で試すことができます。

$ git clone git@github.com:righ/d2a.git
$ cd d2a
$ docker-compose up

起動したら 別タブで以下を入力して DB のマイグレーション (-d している場合は同じでもできますが)

$ docker exec -it d2a_app_1 /bin/bash
# python -m venv venv # only first time
# source venv/bin/activate
(venv) # cd project_postgresql/ # (or mysql)
(venv) project_postgresql # ./manage.py migrate

インタラクティブシェルを起動して

(venv) project_postgresql # ./manage.py shell

あとはご自由にどうぞ

以下は books.models_sqla を import する例です

>>> from books import models_sqla
>>> book = models_sqla.Book()
>>> author = models_sqla.Author()
>>> book.author = author
>>> author.books
[<d2a.book object at 0x7f3cec539358>]

備考

スター待ってるぜ! righ/d2a

ちなみに実案件(py36, dj11)でも利用してます。