SequelizeでModelで定義されているカラム一覧を取得する

管理画面を作ったりする時にモデルの定義に応じてカラムを取得する必要があったので調べてみました。

カラム一覧を取得

モデルのrawAttributesから現在の定義状況を取得できます。

db.User.rawAttributes

このようなオブジェクトとして取得できるので

{ id:
   { type:
      INTEGER {
        options: [Object],
        _length: undefined,
        _zerofill: undefined,
        _decimals: undefined,
        _precision: undefined,
        _scale: undefined,
        _unsigned: undefined },
     allowNull: false,
     primaryKey: true,
     autoIncrement: true,
     _autoGenerated: true,
     Model: User,
     fieldName: 'id',
     _modelAttribute: true,
     field: 'id' },
  name:
   { type: STRING { options: [Object], _binary: undefined, _length: 255 },
     Model: User,
     fieldName: 'name',
     _modelAttribute: true,
     field: 'name' },
  createdAt:
   { type: DATE { options: [Object], _length: '' },
     allowNull: false,
     _autoGenerated: true,
     Model: User,
     fieldName: 'createdAt',
     _modelAttribute: true,
     field: 'createdAt' },
  updatedAt:
   { type: DATE { options: [Object], _length: '' },
     allowNull: false,
     _autoGenerated: true,
     Model: User,
     fieldName: 'updatedAt',
     _modelAttribute: true,
     field: 'updatedAt' } }

keyの部分のみ取得することで、カラム名一覧を取得できます。

console.log(Object.keys(db.User.rawAttributes));
// [ 'id', 'name', 'createdAt', 'updatedAt' ]

タイムスタンプを除いたカラム一覧

_timestampAttributesでタイムスタンプが取得できるのでそれを除いてタイムスタンプ以外のカラム一覧を取得できます。

const attrs = Object.keys(db.User.rawAttributes);
const timestamps = Object.values(db.User._timestampAttributes);
const attributes = attrs.filter(attr => timestamps.indexOf(attr) < 0);

console.log(attributes);
// [ 'id', 'name' ]