エンジニアライフスタイルブログを運営しているミウラ(@miumiu06171)です。
普段はフリーランスでシステムエンジニアをしております。
今回は、こちらの記事で作成したDjangoモデルのプライマリキー(PK)であるIDの値をUUIDに変更する方法を紹介していきます。
動作確認には、Visual Studio Code (VS Code) を使用しているため、同様に確認したい方は、こちらの記事でVS CodeのPython開発環境を構築してみてください。
Djangoモデルのプライマリキーの基本
Djangoでは、モデルからデータベースのテーブルを作成するときにidというプライマリキーが1から順にシーケンシャルに自動的に割り当てられます。
このIDの値でテーブル間のリレーションを貼ります。
DjangoモデルのプライマリキーをUUIDに変更する方法
DjangoモデルのプライマリキーをUUIDに変更する方法を紹介していきます。
UUIDとは
まずUUIDとは、「Universally Unique Identifier」の略で、ソフトウェア上でオブジェクトを一意に識別するための重複しないランダムな文字列です。
このランダムな文字列は、「8c75a029-b92a-42d3-71e6-d16533191100」のように16進数の文字列とハイフンから構成されています。
UUIDのメリット
UUIDが何かわかったところで、次はUUIDを導入するメリットを紹介します。
ID衝突回避
UUIDは、ソフトウェア全体で一意であるため、異なるモデルが同じIDを持つことはありません。
これにより、データベーステーブル内のレコードでIDの衝突を回避することができます。
データベーステーブルのサイズ予測を回避
Djangoモデルのプライマリキーがデフォルトのままだと、IDが整数でインクリメントされた値になるため、データベーステーブルのサイズを外部から推測できてしまう問題があります。
そこで、IDにUUIDのランダムな文字列を設定すると、データベーステーブルのサイズを容易に予測できなくなります。
IDの推測を回避
例えば、「https://sample.com/item/1」のように商品紹介ページのURLにitemのIDが含まれる場合、itemのIDを用いて他のitemのURLを生成することができます。
このようにitemのIDの値が整数の場合、値の予測が簡単であるため、外部からの攻撃を受けやすくなります。
そこで、外部から攻撃を受けないようにIDとしてUUIDを設定することで値の予測が困難になるので、不正にアクセスしようとする事態を防ぐことができます。
UUIDに変更する方法(models.UUIDField)
DjangoモデルのプライマリキーであるIDの値をUUIDに変更する方法をサンプルソースコードを含めて紹介します。
1 2 3 4 5 6 7 8 9 |
import uuid from django.db import models # Create your models here. class SampleAppModel(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) itemname = models.CharField(max_length=100) itemvalue = models.IntegerField() |
以下の2ステップで変更可能です。
1つ目は、上記サンプルソースコードの1行目に示すようにPythonのuuidパッケージをインポートしましょう。
2つ目は、7行目のようにプライマリキーを示すidフィールドをmodels.UUIDField()で定義すればオッケーです。
まとめ
いかがでしたでしょうか。
DjangoモデルのプライマリキーであるIDの値をUUIDに変更する方法を紹介してきました。
Djangoモデルのプライマリキーは、同じデータベース内の別テーブルの外部キーになっている可能性もあるため、設計時にUUIDを設定するかあらかじめ決めておくようにしましょう。
【関連記事】
【Python Django入門】使い方からWebアプリ作成までの流れ
【TIPS】DjangoのSQLite3をMySQLに変更して連携する方法[Windows版]