这是我参与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
}
]
}
]
});