Mohammad Jawad Barati
Mohammad Jawad Barati
خواندن ۳ دقیقه·۴ سال پیش

کار با enum ها توی postgres

وجود این نوع داده توی postgres و mysql کار رو خیلی ساده کرده.

فرض کن یه جدول cars داری که میخوای رنگ هاشون رو هم براشون بنویسی:

create table color( id serial primary key, name text ); create table cars ( brand text, model text, color integer references color(id) ); insert into color(name) values ('blue'), ('red'), ('gray'), ('black'); insert into cars(brand, model, color) select brand, model, color.id from ( values('ferari', 'testarosa', 'red'), ('aston martin', 'db2', 'blue'), ('bentley', 'mulsanne', 'gray'), ('ford', 'T', 'black') ) as data(brand, model, color) join color on color.name = data.color;

نکته: توی کوئری بالا به جای استفاده مستقیم از شماره رنگ اومدیم از مقدارش به صورت مستقیم استفاده کرده‌ایم. این تکنیک رو INSERT … SELECT میگن، وقتی این کار رو میکنی خودش میره توی جدول reference دنبال رکورد میگرده.

خب حالا این بحث ها به کنار، وقتی میخوای رکورد های جدول cars رو به کاربر بدی باید چجوری کوئری بزنی؟

select brand, model, color.name as color from cars join color on color.id = cars.color;

خب همون جوری که میبینی داری یه join به خاطر یه اسم میزنی. چه کاریه؟ خب بیا enum تعریفش بکن و خودتو راحت بکن.

create type color_t as enum('blue', 'red', 'gray', 'black'); drop table if exists cars; create table cars( brand text, model text, color color_t ); insert into cars(brand, model, color) values ('ferari', 'testarosa', 'red'), ('aston martin', 'db2', 'blue'), ('bentley', 'mulsanne', 'gray'), ('ford', 'T', 'black');

خب به همین راحتی بدون تعریف یه جدول دیگه تونستی کارتو راه بندازی. حالا جزئیات دقیق تر:

  • به صورت داخلی enum ها از integer ها استفاده میکنن.
  • توی postgres میتونی یه enum تعریف بکنی و هر جایی که خواستی ازش استفاده بکنی.
  • توی postgres محل ذخیره سازی enum ها system catalogs هست. خودمم دقیق این بخششو متوجه نشدم که یعنی چی. به همین دلیل انگلیسی اونو براتون میزارم. (اگه نظری داشتی تو کامنت برام بنویس)

نکات پایانی

  • مورد استفاده enum ها جایی هست که یه لیست از مقادیر داری که مطمئنی در طول عمر برنامت هیچ وقت عوض بشو نیستن. ولی مثلا اگه میخوای به ادمین این دسترسی رو بدی که اون enum رو عوض بکنه بهتره از یه جدول جداگونه استفاده بکنی.
  • در موارد خیلی زیادی استفاده از این enum ها بهترین سولوشن ممکن هست. مثلا برای من و یکی از دوستانم که asp core کار میکنه این enum ها خیلی کاربردی بوده.

رفرنس


استفاده از enum توی sequelize

خب به عنوان اولین نکته اینو در نظر بگیر که این قابلیت فقط روی postgres قابل پیاده سازی هست. برای اینکه یه فیلدی رو به صورت enum در نظر بگیری میتونی وقتی مدل رو داری تعریف میکنی بیای نوعش رو enum بزاری.

const { Model, DataTypes } = require('sequelize'); class Test extends Model {}; Test.init({ f1: { type: DataTypes.ENUM('v1', 'v2', 'v3'), defaultValue: 'v1' } }, {}); module.exports = Test;

خب حالا وقتی میخوای رکورد توی دیتابیس ثبت بکنی باید اینجوری عمل بکنی:

Test.create({ f1: 'v1' });

و برای اینکه مقادیر اون enum رو بگیری باید اینجوری عمل بکنی:

console.log(Test.rawAttributes.f1.values); // [ 'v1', 'v2', 'v3' ]

با تشکر از توجه و کامنتای نوشته/نانوشته شما :)

sequelizeenumnode jspostgresmysql
برنانه نویس، مدرس، محقق. عاشق انیمه هستم و دنبال چالش ها جدید.
شاید از این پست‌ها خوشتان بیاید