DjangoのORMが発行したSQLを直接確認する方法(サンプルコードあり)

2021年11月17日Djangoの豆知識ORM,SQL,データベース,ロギング

DjangoのORMは非常に便利ですが、どんなSQLが発行されているか見えないと不安ですね。そこで今回はDjangoが発行しているSQLを確認できるやり方をサンプルコードつきでご紹介します。サンプルコードはこちらです。

サンプルコードで環境構築

  1. Githubからclone
git clone -b db_query_checker https://github.com/yeconnect/django-baby-starter-template.git

2. ディレクトリを移動

cd django-baby-starter-template

3. データベースを作成

docker compose run --rm web python manage.py migrate

4. ローカルでサーバーを起動

docker compose up

5. ブランチでチェック

http://localhost:4989/todo

動作確認

http://localhost:4989/todo に飛ぶと、ページが表示されています。

ここでターミナルを確認すると下の写真のようにSQLが実際に確認できました。

コード解説

SQLをターミナルに出力するように設定しているのは/config/settings.pyの95行目からのこの部分です。

LOGGING = {
    'disable_existing_loggers': False,
    'version': 1,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'level': 'DEBUG', 
        },
    },

    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
    },
}

Djangoのロギングの詳細については公式にありますがわかりにくめなので記事を現在用意しています。

その他の方法

最後に.queryを付ける

views.pyで下のように.queryを付ける方法もあります。

sql = Todo.objects.all().query
print(sql)

サンプルコードのこちらにもあります。

ただし、これはデータの取得には使えますが、新規作成などのときは使用できません。

さらにDjangoはtodos = Todo.objects.all() などのコードであってもその後のコード次第でSQLが変わって来るので正確なSQLはわからないという問題もあります。そのためこのやり方はあまりおすすめできません。