这是我参与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' }