Django で生のクエリを操作する

Salman Mehmood 2022年8月18日
Django で生のクエリを操作する

この説明では、raw() メソッドの機能と raw クエリの操作方法について学習します。また、Django のアプリケーション内に SQL を挿入する方法についても学習します。

Django の raw() メソッドを使用して生のクエリを操作する

Django で raw() メソッドを使用すると、SQL クエリを取得または構築して実行できます。しかし、これは Django で SQL クエリを実行する唯一の方法ではありません。デフォルトのフォーム設定を利用する代わりに、必要に応じて、フォームをバイパスして SQL クエリを実行することもできます。

しかし、なぜ私たちはそれについて言及したのですか?なぜなら、生の SQL クエリを実行する場合は、通常、モデルマネージャの raw() メソッドを最初のオプションにする必要があるためです。

これは、生のクエリセットクラスインスタンスの構造が、クエリセットクラスインスタンスで操作してきたものと非常に似ているためです。インデックス作成やスライスなど、生のクエリで他のアクションを実行できます。

それでは、本当に簡単な例から始めましょう。先に進んで、STUDENT_DATA() という新しい関数を作成しましょう。

models.py ファイルでは、単純なデータセットと Student モデルを使用します。

class Student(models.Model):

    FIRST_NAME = models.CharField(max_length=100)
    SR_NAME = models.CharField(max_length=100)
    age = models.IntegerField()
    CLASS_ROOM = models.IntegerField()
    TEACHER = models.CharField(max_length=100)

    def __str__(self):
        return self.FIRST_NAME

次に、views.py ファイルに戻り、STUDENT_DATA() という関数を作成して、生の SQL をデモンストレーションします。

関数内では、Student.objects.all() を使用して Student テーブルからすべてのデータを取得します。これにより、このテーブルからすべての学生データが返され、SD_DATA に保存されます。

このオブジェクトを印刷してみましょう。また、SQL の出力といくつかのパフォーマンス測定値を提供する connection.queries を利用します。

def STUDENT_DATA(request):

    SD_DATA = Student.objects.all()

    print(SD_DATA)
    print(connection.queries)
    return render(request, "output.html", {"data": SD_DATA})

先に進んでサーバーを実行しましょう。ブラウザにすべてのデータが表示され、以下に、実行した SQL クエリを取得したことがわかります。

Django Raw SQL 出力 1

先に進み、raw() メソッドを使用して同等のものを作成しましょう。したがって、ここでも student とそのオブジェクトを使用しますが、今回は raw() を使用します。

このメソッド内で SQL クエリを実行する必要があります:SELECT * FROM student_student

これらの個々の項目をすべて選択する必要はないので、スターを使用してすべてのテーブルフィールドを選択できます。次の句は、テーブルを見つけるのに役立つ FROM です。次に、student_student というテーブル名を定義します。

SD_DATA = Student.objects.raw("SELECT * FROM student_student")

ブラウザに戻って更新しましょう。次に、Select ステートメントを使用してデータベースからこれらのアイテムを返していることがわかります。

Django Raw SQL 出力 2

次に、これを少し拡張して、個々のアイテムを選択します。これを行うには、WHERE 句を使用する必要があります。1つのスペースの後、age 属性を選択し、それを 21 の値として渡します。

SD_DATA = Student.objects.raw("SELECT * FROM student_student WHERE age=21")

Django サーバーを再実行して、ブラウザーを更新してみましょう。次に、SQL が機能していることを確認し、データベースから 1つのアイテムを返します。

Django Raw SQL 出力 3

SQL を Django の raw() 関数に挿入する方法と、データベースでアクションを実行する方法を見てきました。

Django のドキュメントでは、モデルのインスタントリファレンスを調べて読み通すと、遅延モデルに関する情報が得られます。遅延モデルインスタンスという用語は、オンデマンドでロードするまでクエリから出力されるフィールドを意味します。

データを印刷するには、出力に表示するデータを指定する必要があります。そのためには、for ループを使用する必要があります。

for d in Student.objects.raw("SELECT * FROM student_student"):
    print(d)

これを再実行する場合は、これを出力してテーブルから 3つの名前を返すため、コンソールを調べてください。

Django Raw SQL 出力 4

より複雑なクエリはここにあります。たとえば、クエリセットの作成と呼ばれる概念は、返すオブジェクトの数を制限できることを意味します。

次に、sql という新しい変数を宣言し、SQL クエリをその変数に格納して、raw() 関数内に渡します。raw() 関数の後で、オブジェクトをスライスして 2 行を制限します。

sql = "SELECT * FROM student_student"
SD_DATA = Student.objects.raw(sql)[:2]

出力を見ると、2つの行が返されているだけです。

Django Raw SQL 出力 5

views.py ファイルの完全なソースコード:

from django.shortcuts import render
from .models import Student
from django.db import connection


def STUDENT_DATA(request):

    SD_DATA = Student.objects.all()
    sql = "SELECT * FROM student_student"
    SD_DATA = Student.objects.raw(sql)[:2]
    # for d in Student.objects.raw('SELECT * FROM student_student'):
    #     print(d)

    print(SD_DATA)
    # print(connection.queries)
    return render(request, "output.html", {"data": SD_DATA})

テンプレート内で次のコードを使用しました。

{{data}}

<hr/>

{% for i in data %}
    <div>{{ i.FIRST_NAME }} - {{ i.age }}</div>
{% endfor %}
著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

関連記事 - Django SQL