NodeJS的sequelize小知识3

200 阅读2分钟

这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战

约束 & 循环

在表之间添加约束意味着使用 sequelize.sync 时必须在数据库中以一定顺序创建表. 如果 Task 具有对 User 的引用,则必须先创建 User 表,然后才能创建 Task 表. 有时这可能会导致循环引用,而 Sequelize 无法找到同步的顺序

const { Sequelize, Model, DataTypes } = require("sequelize");

class Document extends Model {}
Document.init({
    author: DataTypes.STRING
}, { sequelize, modelName: 'document' });

class Version extends Model {}
Version.init({
  timestamp: DataTypes.DATE
}, { sequelize, modelName: 'version' });

Document.hasMany(Version); // 这会将 documentId 属性添加到 version 中
Document.belongsTo(Version, {
  as: 'Current',
  foreignKey: 'currentVersionId'
}); // 这会将 currentVersionId 属性添加到 document 中

不受限制地强制执行外键引用

可能引用另一个表,而不添加任何约束或关联, 在这种情况下,可以将引用属性手动添加到架构定义中,并标记它们之间的关系.

class Trainer extends Model {}
Trainer.init({
  firstName: Sequelize.STRING,
  lastName: Sequelize.STRING
}, { sequelize, modelName: 'trainer' });

// 在调用 Trainer.hasMany(series) 之后,
// Series 将会有一个 trainerId = Trainer.id 外参考键
class Series extends Model {}
Series.init({
  title: Sequelize.STRING,
  subTitle: Sequelize.STRING,
  description: Sequelize.TEXT,
  // 设置与 `Trainer` 的外键关系(hasMany)
  trainerId: {
    type: DataTypes.INTEGER,
    references: {
      model: Trainer,
      key: 'id'
    }
  }
}, { sequelize, modelName: 'series' });

// 在调用 Series.hasOne(Video) 之后,
// Video 将具有 seriesId = Series.id 外参考键
class Video extends Model {}
Video.init({
  title: Sequelize.STRING,
  sequence: Sequelize.INTEGER,
  description: Sequelize.TEXT,
  // 设置与 `Series` 的关系(hasOne)
  seriesId: {
    type: DataTypes.INTEGER,
    references: {
      model: Series, // 可以是代表表名的字符串,也可以是 Sequelize 模型
      key: 'id'
    }
  }
}, { sequelize, modelName: 'video' });

Series.hasOne(Video);
Trainer.hasMany(Series);

索引

Sequelize 支持在模型定义上添加索引,该索引将在 sequelize.sync() 上创建

const User = sequelize.define('User', { /* 属性 */ }, {
  indexes: [
    // 在 email 上创建唯一索引
    {
      unique: true,
      fields: ['email']
    },

    // 使用 jsonb_path_ops 运算符在 data 上创建 gin 索引
    {
      fields: ['data'],
      using: 'gin',
      operator: 'jsonb_path_ops'
    },

    // 默认情况下,索引名称将为 [table]_[fields]
    // 创建多列部分索引
    {
      name: 'public_by_author',
      fields: ['author', 'status'],
      where: {
        status: 'public'
      }
    },

    // 具有 order 字段的 BTREE 索引
    {
      name: 'title_index',
      using: 'BTREE',
      fields: [
        'author',
        {
          attribute: 'title',
          collate: 'en_US',
          order: 'DESC',
          length: 5
        }
      ]
    }
  ]
});