レガシーテーブルの操作
Sequelizeはデフォルトでは少し独断的なように見えますが、テーブルとフィールドの名前(そうでない場合は生成される)を定義することで、レガシーテーブルを簡単に操作し、アプリケーションを将来にわたって保証できます。
テーブル
class User extends Model {}
User.init(
  {
    // ...
  },
  {
    modelName: 'user',
    tableName: 'users',
    sequelize,
  },
);
フィールド
class MyModel extends Model {}
MyModel.init(
  {
    userId: {
      type: DataTypes.INTEGER,
      field: 'user_id',
    },
  },
  { sequelize },
);
主キー
Sequelizeはデフォルトで、テーブルにid主キープロパティがあると仮定します。
独自の主キーを定義するには
class Collection extends Model {}
Collection.init(
  {
    uid: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      autoIncrement: true, // Automatically gets converted to SERIAL for postgres
    },
  },
  { sequelize },
);
class Collection extends Model {}
Collection.init(
  {
    uuid: {
      type: DataTypes.UUID,
      primaryKey: true,
    },
  },
  { sequelize },
);
また、モデルに主キーがまったくない場合は、Model.removeAttribute('id');を使用できます。
主キーのないインスタンスは、Model.findOneとModel.findAllを使用して取得できます。
インスタンスメソッド(instance.save、instance.updateなど)を使用することは現在可能ですが、これを行うと微妙なバグが発生する可能性があり、将来のメジャーアップデートで削除される予定です。
情報
モデルに主キーがない場合は、次のインスタンスメソッドの静的同等を使用し、独自のwhereパラメータを指定する必要があります
- instance.save:- Model.update
- instance.update:- Model.update
- instance.reload:- Model.findOne
- instance.destroy:- Model.destroy
- instance.restore:- Model.restore
- instance.decrement:- Model.decrement
- instance.increment:- Model.increment
外部キー
// 1:1
Organization.belongsTo(User, { foreignKey: 'owner_id' });
User.hasOne(Organization, { foreignKey: 'owner_id' });
// 1:M
Project.hasMany(Task, { foreignKey: 'tasks_pk' });
Task.belongsTo(Project, { foreignKey: 'tasks_pk' });
// N:M
User.belongsToMany(Role, {
  through: 'user_has_roles',
  foreignKey: 'user_role_user_id',
});
Role.belongsToMany(User, {
  through: 'user_has_roles',
  foreignKey: 'roles_identifier',
});