MySQLのenum型をDjango ORMで扱う
文字列型で、決められた値のみ保存できる、と考えてよさそう
ただし、内部では文字列ではない値で管理されるため、VARCHARより消費データ量が少ない
'medium' の値を持つ 100 万個の行をこのテーブルに挿入するには、100 万バイトのストレージが必要ですが、実際の文字列 'medium' を VARCHAR カラムに格納した場合は、600 万バイト必要になります。
SQLサンプル
code:sql
CREATE TABLE shirts (
name VARCHAR(40),
size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);
INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),
('polo shirt','small');
SELECT name, size FROM shirts WHERE size = 'medium';
+---------+--------+
| name | size |
+---------+--------+
| t-shirt | medium |
+---------+--------+
UPDATE shirts SET size = 'small' WHERE size = 'large';
COMMIT;
Djangoでの対処方法
素のDjango (3.0以降) を使う場合
code:python
RoleChoices = models.IntegerChoices('RoleChoices', 'admin member')
class User(models.Model):
role = models.IntegerField(choices=RoleChoices.choices)
MySQL上では単にint型になって、check constraintなども設定されなかった
code:ddl.sql
CREATE TABLE "users" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"role" integer NOT NULL,
);