3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Django のモデル定義を一瞬で SQLAlchemy に変換する魔法のような方法

Last updated at Posted at 2021-04-17

魔法、それは聖なる力🌞 (元ネタはしりません)

Qiitaに書くのは初めてなのですごく緊張しています🙄
そんなに長くないので最後まで読んでいただけるとうれしいです。

対象読者は以下のような方を想定しています😺

  • Djangoと一緒にSQLAlchemyを使いたいが、モデルを定義するのがめんどくさい方😡
  • Djangoから他のフレームワークに移行してORMにSQLALchemyを使いたい方🥺

以前も同じような記事を自分のブログで書いたんですが、今回は一味違います。(ハードルを上げていくスタイル)

こちらのライブラリを使います👇

当然かもしれませんが Django と SQLAlchemy がインストールされている必要があります。Django は 2.2以上、SQLAlchemy は 1.1以上であれば動作するはずです。

基本的な使い方

使い方はかんたん。インストールしてコマンド実行するだけです🍄

pip やらでインストールして、

$ pip install d2a -U

settings.INSTALLED_APPS に追加して、

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # :
    # :
    'd2a',
]

コード実行 (完)

$ ./manage.py sqla_codegen

実際にコード生成されたものがこちらです。(指定したオプションは少し違いますが...)

さて、このコード生成というのは d2a の3系でリリースされたもので、2系までは変換したものはインメモリで保持していました🧠
しかしインメモリで保持するとエディタの補完も効かないし実際に何が行われているのかわからないという大きなデメリットがあります。しかもこんなスターの少ないライブラリを本番のランタイムで動かすなんて不安だ。そう思われてしまっても仕方ありません😵

でもコード生成なら出力されたファイルを確かめられるし、もし間違っていても自分の手で修正できるわけです🤝
生成されたファイルはほぼ SQLAlchemy にしか依存していないというのが地味に注目ポイントです。
Columnのdefault引数については Django のモデルを参照していますが、これは関数等のコーラブルなオブジェクトが指定された場合に文字列に戻すことができないため苦肉の策です。

Djangoを使っている方は定期的にコマンド実行して出力されたファイルをリポジトリに格納すると良いでしょう。自動生成系のファイルはリポジトリに入れないという考えの人がいるかも知れませんがこれは入れてください。

他のFWに移行する方は後述する設定ファイルにてdefaultにNoneなどを指定して出力すればDjangoへの依存も全くなくなります👌

少し進んだ使い方

コマンドオプション

コマンドのオプションは現状3つだけです💅

  • --path: 生成先のファイルパス
  • --template-path: テンプレートのパス(settings.TEMPLATES からの相対パス)。パス指定されたテンプレートによって生成コードを自由に変更できる
  • --db-type: データベースのタイプ。settingsから自動的に判断するため基本は指定しなくてOK。

設定ファイル

settings.D2A_CONFIG を設定することで細かい生成ルールやカスタムフィールドの扱いをハンドリングできます🍏

ショートカット

せっかくDjangoを使っているのにSQLALchemyを使うためにDBの接続情報を二重で定義したくありませんよね。

d2aで用意してあるショートカット関数を使うことで Django の接続情報を使ってクエリを発行できます。是非試してみてください。

おわりに

このライブラリも初回にリリースしてから3年ほど経ったようです🤓
最初は全然使えなかったんですが、少しずつ機能拡張をするうちに段々とライブラリらしくなってきたようで嬉しく思っています。

もし少しでも興味を持った方がいたらスターしてもらえるとうれしいです😭
モチベーションになります!

ブログもあるんですが、過疎化しているので紹介系の記事は利用者の多いプラットフォームに書いてます🐸
勉強した内容とかはブログ👇に書くので興味ある方はこちらもよろしくおねがいします👻

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?