NodeJS的sequelize的模型命名策略

398 阅读2分钟

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

命名策略

Sequelize 为模型提供了 underscored 参数. 设为 true 时,此参数会将所有属性的 field 参数设置为其名称的 蛇形命名法,类似user_name, 适用于由关联和其他自动生成的字段自动生成的外键

const User = sequelize.define('user', { username: Sequelize.STRING }, {
  underscored: true
});
const Task = sequelize.define('task', { title: Sequelize.STRING }, {
  underscored: true
});
User.hasMany(Task);
Task.belongsTo(User);

模型 User 和 Task, 都使用了 underscored 的参数. 他们之间也有一对多的关系. 另外,由于默认情况下 timestamps 为 true, 因此 createedAt 和 updatedAt 字段也将自动创建.

如果没有 underscored 参数,Sequelize 会自动定义:

  • 每个模型的 createdAt 属性,指向每个表中名为 createdAt 的列
  • 每个模型的 updatedAt 属性,指向每个表中名为 updatedAt 的列
  • Task 模型中的 userId 属性,指向任务表中名为 userId 的列

启用 underscored 参数后,Sequelize 将定义:

  • 每个模型的 createdAt 属性,指向每个表中名为 created_at 的列
  • 每个模型的 updatedAt 属性,指向每个表中名为 updated_at 的列
  • Task 模型中的 userId 属性,指向任务表中名为 user_id 的列

代码上调用 sync() 将会生成以下内容:

CREATE TABLE IF NOT EXISTS "users" (
  "id" SERIAL,
  "username" VARCHAR(255),
  "created_at" TIMESTAMP WITH TIME ZONE NOT NULL,
  "updated_at" TIMESTAMP WITH TIME ZONE NOT NULL,
  PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "tasks" (
  "id" SERIAL,
  "title" VARCHAR(255),
  "created_at" TIMESTAMP WITH TIME ZONE NOT NULL,
  "updated_at" TIMESTAMP WITH TIME ZONE NOT NULL,
  "user_id" INTEGER REFERENCES "users" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
  PRIMARY KEY ("id")
);

单数与复数

Sequelize 在后台使用了一个名为 inflection 的库,以便正确计算不规则的复数形式(例如 person -> people). 当然也可以直接定义名称的单数和复数形式, sequelize 允许通过一些参数定义单数和复数形式

定义模型时

模型应以单词的单数形式定义, 下面模型名称是 foo(单数),表名称是 foos,因为 Sequelize 会自动获取表名称的复数形式

sequelize.define('foo', { name: DataTypes.STRING });

从预先加载中检索数据时

当在查询中执行 include 时,包含的数据将会根据以下规则添加到返回对象的额外字段中:

  • 当包含来自单个关联(hasOne 或 belongsTo)的内容时,字段名称将是模型名称的单数形式;
  • 当包含来自多个关联(hasMany 或 belongsToMany)的内容时,字段名称将是模型的复数形式.

定义别名时覆盖单数和复数

在为关联定义别名时,可以传递一个对象以指定单数和复数形式,而不仅仅使用 { as: 'myAlias' }