【Django】データベース操作(取得・作成・更新・削除):ORMの利用

2021.10.10 /

【Django】データベース操作(取得・作成・更新・削除):ORMの利用

本記事ではDjangoによる基本的なデータベース操作(取得・作成・更新・削除)について解説していきます。

Djangoでデータベース操作を行うにはORMという技法を利用しています。

DjangoによるWebアプリケーションを作成する上で、データベース操作の知識は必須になります。

本記事を通して基本的なデータベース操作を覚えてください。

ORMとは

Djangoではデータベース操作(取得・作成・更新・削除など)にORMという技法を使用します。

ORMはObject-Relational Mappingの略で、日本語に訳すと「オブジェクトとリレーショナル間のマッピング」です。このままだと何が何だかわからないですよね。

オブジェクト(Object)は、models.pyのクラスから生成されます。
リレーショナル(Relational)は、関係データベースのことを指します。

つまりORMとは、データベースとマッピングされたオブジェクトを利用して、データベースを操作する技法のことです。

このORMを利用することで、SQLを意識せずにデータベース上のデータを管理することができます。

オブジェクトにはクエリを使うことで、データベースからデータを取得します。

IT用語の確認

クエリ(query)とは、DBMS(データベース管理システム)に対して取得・追加・更新などの処理を要求するための記述方です。またクエリにより取得したデータリストをクエリセット(queryset)と呼びます

ここではmodels.pyに定義した次のモデルを利用します。

# models.py
from django.db import models

class Member(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    address = models.CharField(max_length=255)
    age = models.PositiveIntegerField()
    mail = models.EmailField()

このモデルから生成したオブジェクトに対してORMを利用することで、SQLを意識せずにデータベース操作を行っていきます。

クエリによるデータベース操作

DjnagoでORMを使ったデータベースの操作(取得・作成・更新・削除)について解説していきます。

データベース操作で利用するクエリは次の構文を基本とします。

構文

モデルクラス.マネージャー.メソッド()

マネージャーとは、データベースへのクエリ操作を提供するインターフェースです。デフォルトではobjectsです。

スクリプトでデータベース操作を行う際は、必ずモデルクラスをインポートしておきます。本記事ではMemberモデルをインポートします。

from .models import Member

対話シェルでデータベース操作の確認

データベース操作の確認にはPython対話シェルを利用することをお勧めします。

対話シェルは次のコマンドを実行することで開きます。

python manage.py shell

まずは利用したいモデルをインポートしてから、データベース操作を行ってください。

from .models import モデル名

取得(Read)

全件取得(全列)

モデルクラスからデータを全件取得する場合は、all()メソッドを使用します。

構文

モデルクラス.objects.all()

スクリプトでは生成されたオブジェクトを変数に入れて使用します。

from .models import Member
members = Member.objects.all()

SQLで書くとSELECT句を利用した次のようになります。

SELECT * FROM "five_member"

データ1つのみを取得

モデルクラスから指定した条件に合致するデータ1つを取得する場合は、get()メソッドを利用します。

構文

モデルクラス.objects.get(列名=条件)

get()メソッドは次のような特徴があります。

  1. 単一オブジェクトを取得する
  2. 条件に合致するデータがなければ例外が発生する
  3. 条件に複数のデータが合致する場合も例外が発生する
  4. 実行後にデータベースとコネクションを確立する

モデルMemberの列first_nameがofficeであるデータを抽出する場合は次のようにします。

result = Member.objects.get(first_name="office")

注意点として、必ずデータ1つのみが条件に合致する場合のみ利用することです。

複数のデータが条件に合致する可能性がある場合は、filter()メソッドを利用します。

get()メソッドで取得したオブジェクトは、直接フィールド名を指定してデータを取得できます。

print(result.first_name)
# office

指定列の取得

指定した列の値を取得したい場合は、values()メソッドを利用します。

引数には抽出したい列名を指定します。

構文

モデルクラス.objects.all().values(列名)

モデルMemberから列first_nameの値だけを抽出する場合は次のようにします。

first_name = Member.objects.all().values("first_name")

SQLで書くとSELECT句を利用した次のようになります。

SELECT “five_member”.”first_name” FROM "five_member"

条件で指定

指定した条件に合致したデータを抽出する場合は、filter()メソッドを利用します。

構文

モデルクラス.objects.all().filter(列名=条件)

モデルMemberから列first_nameがofficeのデータを抽出する場合は次のようにします。

results = Member.objects.all().filter(first_name="office")

生成されたオブジェクト(上記でresults)は、抽出した結果がリスト型で格納されています。中身を取得するにはfor文などを利用します。

for result in results:
    print(result.first_name)

filter()メソッドで複数の条件(AND)を付ける場合は、各条件をカンマで繋げます。

モデルクラス.objects.all().filter(列名=条件1, 列名=条件2)

OR条件の場合は、パイプで各条件を繋げます。またdjango.db.models.Qをインポートする必要があります。

モデルクラス.objects.all().filter(列名=条件1| 列名=条件2)

filter()メソッドやget()メソッド、exclude()メソッドといった引数に条件を指定するメソッドには、フィールドルックアップを利用した検索条件を指定する方法があります。

フィールドルックアップによる検索条件の指定については以下記事をご参照ください。

条件を除外して取得

指定した条件以外のデータを抽出したい場合、exclude()メソッドを利用します。

構文

モデルクラス.objects.all().exclude(列名=条件)

モデルMemberから列first_nameがoffice以外のデータを抽出するには次のようにします。

result = Member.objects.all().exclude(first_name="office")

取得の範囲指定

メソッドの末尾に添字・スライスを追加することで取得するデータの範囲や、取得するデータの位置を指定することができます。

result_first = Member.objects.all()[0]
# 最初のデータを指定
results_three = Member.objects.all()[:3]
# 上位3つのデータを範囲指定

最初のデータや最後のデータを取得するために、first()メソッドやlast()メソッドを利用することもできます。

result_first = Member.objects.all().first()
# 最初のデータを取得
result_last = Member.objects.all().last()
# 最後のデータを取得

テーブルの結合

ここまでテーブルからデータを取得する様々なメソッドを解説してきました。

これらメソッドのみで外部キーにより紐づいている複数のテーブルからデータを取得すると、大量のデータベースアクセスが発生してしまいます。
これによりWebアプリケーションの処理が遅くなってしまいます。

この問題を防ぐためにクエリ時にテーブル結合を行います。

テーブル結合について詳しい解説は以下記事で行っています。

作成(Create)

モデルクラスからデータを作成(追加)する場合は、create()メソッドを使用します。

構文

モデルクラス.objects.create(各フィールドの値)

モデルMemberを利用して、データベースにデータを追加するには次のように書きます。

from .models import Member
Member.objects.create(first_name="office", last_name="54", address="Japan", age="54", mail="example@office54.net")

更新(Update)

データベースのデータを更新する場合は、更新したいデータのオブジェクトを取得し、そのフィールドデータを直接書き換えます。

以下ではfirst_nameがofficeのオブジェクトを取得し、そのfirst_nameを別名に変更しています。

result = Member.objects.get(first_name="office")
result.last_name = "test"
result.save()

書き換えたらsave()メソッドを呼び出して、データベースに反映させます。

削除(Delete)

データベースのデータを削除する場合は、削除したいデータのオブジェクトを取得し、そのオブジェクトに対してdelete()メソッドを使用します。

result = Member.objects.get(first_name="office")
result.delete()

データベースとのコネクション

どのWebアプリケーションもデータベース操作をするためには、まずデータベースとコネクションを確立する必要があります。PHPでいうPDO(PHP Data Objects)ですね。

DjangoのORMでは、最初にSQLが発行されるときにデータベースとのコネクションが接続されます。

2回目以降のSQLでは、すでに接続されているコネクションを利用します。

推奨はされていませんが、SQL実行毎にコネクションを接続したい場合は、次のようにして強制的にコネクションをクローズできます。

from django.db import connection
connection.close()

まとめ

本記事「【Django】データベース操作(取得・作成・更新・削除):ORMの利用」はいかがでしたか。

本記事で紹介したデータベース操作は、DjangoによるWebアプリケーションを作成する上で必須の知識です。

実際にご自身のDjangoで使って、理解を深めてください。