

Djangoに搭載されているデータベースクライアント(ORマッパー)の機能で、  
実行したSQL文字列を取得することは可能でしょうか？  
パラメータが埋め込まれたSQL文をログ出力するために、利用したいと考えています。

下記の例では、  
SELECT * FROM test_table WHERE id='A001';  
のように、Where句のパラメータが埋め込まれたものを取得したいです。

[code]

    # Djangoのインストール
    # !pip3 install --upgrade django
    
    from django.db import connection
    
    with connection.cursor() as cursor:
        # テーブルの作成
        cursor.execute(sql='DROP TABLE IF EXISTS test_table;')
        cursor.execute(sql='CREATE TABLE test_table(id integer, name text);')
        # データの追加
        cursor.execute(sql='INSERT INTO test_table(id, name) VALUES("A001", "apple");')
        cursor.execute(sql='INSERT INTO test_table(id, name) VALUES("A002", "banana");')
    
    with connection.cursor() as cursor:
        # データの検索
        cursor.execute(sql='SELECT * FROM test_table WHERE id=%s;', params=['A001'])
        for row in cursor.fetchall():
            print(row[0], row[1])
    
    print('SQL')  # <---ここで直前に実行したSQL文(SELECT文)をログ出力したい。
    
[/code]

実行結果

[code]

    A001 apple
    
[/code]


CC BY-SA 4.0
2023-05-13T09:48:55.073
94835
2023-05-17T08:43:12.117
2023-05-17T08:43:12.117
35267
35267
question
python3 django sqlite
DjangoのDBで、モデルクラスを利用することなく、実行したSQLを取得する方法


QuerySet.query を文字列化することでSQLが得られます(A)。  
ログ出力という観点では、Django標準の機能を使う方法もあります(B)。

A. ORMのQuerySetオブジェクトを文字列化する

[code]

    qs = User.objects.all()
    print(str(qs.query))
    
[/code]

A2. Aの文字列を読みやすくフォーマットする

[code]

    qs = User.objects.all()
    query = qs.query
    
    from sqlparse import format as sfmt
    print(sfmt(str(query), reindent_aligned=True))
    
[/code]

B. DjangoのLOGGINGを設定する

`settings.py`

[code]

    LOGGING = {
        ...
        "loggers": {
            "django.db.backends": {
                "handlers": [...],
                "level": "DEBUG",  # デフォルトはERRORのみログ出力
                "propagate": False,
            },
    
[/code]

参考

  * [ロギング | Django ドキュメント | Django](https://docs.djangoproject.com/ja/4.2/ref/logging/#django-db-backends)
  * [逆引きDjangoORM: ORMで生成されるSQLを確認したい - 清水川のScrapbox](https://scrapbox.io/shimizukawa/%E9%80%86%E5%BC%95%E3%81%8DDjangoORM:_ORM%E3%81%A7%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%82%8BSQL%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%9F%E3%81%84#6284794d1911970000d89d22)
  * [Django + gunicorn のログ出力設定 - 清水川のScrapbox](https://scrapbox.io/shimizukawa/Django_+_gunicorn_%E3%81%AE%E3%83%AD%E3%82%B0%E5%87%BA%E5%8A%9B%E8%A8%AD%E5%AE%9A)
  * [60:Django ORMでどんなSQLが発行されているか気にしよう — 自走プログラマー【抜粋版】](https://jisou-programmer.beproud.jp/DjangoORM%E3%81%A8%E3%81%AE%E4%BB%98%E3%81%8D%E5%90%88%E3%81%84%E6%96%B9/60-Django_ORM%E3%81%A7%E3%81%A9%E3%82%93%E3%81%AASQL%E3%81%8C%E7%99%BA%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E6%B0%97%E3%81%AB%E3%81%97%E3%82%88%E3%81%86.html)
  * [【第17回】Django ORM道場 ……クエリの基本を押さえ，より良い型を身に付けよう - WEB+DB PRESS Vol.133｜技術評論社](https://gihyo.jp/magazine/wdpress/archive/2023/vol133)


CC BY-SA 4.0
2023-05-15T00:42:05.030
94846
2023-05-15T00:42:05.030
806
94835
answer