在 Sequelize 中,定义唯一键是指在数据库中创建一个能够唯一标识一条记录的字段或者一组字段。这个字段或组合字段可以保证表中的数据行的唯一性,避免了数据的冗余和重复。
下面是如何在 Sequelize 中定义唯一键的方法。
1. 在模型定义中使用unique属性
使用 unique 属性是在 Sequelize 中定义唯一键最简便的方法,可以在模型定义中直接添加一个 unique 属性来定义唯一键,如下所示。
// javascriptcn.com 代码示例 const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize('database', 'username', 'password', { dialect: 'mysql' }); const User = sequelize.define('User', { username: { type: DataTypes.STRING, unique: true }, email: { type: DataTypes.STRING, unique: true } });
上面的例子中,我们定义了一个 User 模型,并使用 unique 属性分别定义了 username 和 email 两个字段为唯一键,这样在数据库中就不能插入重复的 username 和 email 值。
需要注意的是,当使用 unique 属性定义唯一键时,Sequelize 会在数据库中自动为这些字段添加索引,这可以提高查询性能。
2. 在模型定义中使用validate属性
使用 validate 属性也可以在 Sequelize 中定义唯一键。这种方法可以更加灵活地定义唯一键的条件和错误信息,代码示例如下。
// javascriptcn.com 代码示例 const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize('database', 'username', 'password', { dialect: 'mysql' }); const User = sequelize.define('User', { username: { type: DataTypes.STRING, allowNull: false, validate: { isUnique: async function(value) { const user = await User.findOne({ where: { username: value } }); if (user) { throw new Error('Username already exists!'); } } } }, email: { type: DataTypes.STRING, allowNull: false, validate: { isUnique: async function(value) { const user = await User.findOne({ where: { email: value } }); if (user) { throw new Error('Email already exists!'); } } } } });
上面的例子中,我们定义了一个 User 模型,并使用 validate 属性的自定义校验方法 isUnique 来分别定义了 username 和 email 两个字段为唯一键,这样在数据库中就不能插入重复的实例。
需要注意的是,当使用 validate 属性定义唯一键时,Sequelize 不会自动为这些字段添加索引,需要手动添加索引以提高查询性能。
3. 在迁移中手动添加唯一键
除了在模型定义中使用 unique 属性或 validate 属性来定义唯一键外,也可以在数据库迁移中手动添加唯一键。这种方法可以更加灵活地控制唯一键的条件和名称等信息,并且可以在不同的数据库平台上使用相同的方法。
下面是在迁移中手动添加唯一键的代码示例。
// javascriptcn.com 代码示例 'use strict'; module.exports = { up: async (queryInterface, Sequelize) => { await queryInterface.addConstraint('Users', { fields: ['username'], type: 'unique', name: 'custom_unique_constraint_name' }); await queryInterface.addConstraint('Users', { fields: ['email'], type: 'unique', name: 'custom_unique_constraint_name' }); }, down: async (queryInterface, Sequelize) => { await queryInterface.removeConstraint('Users', 'custom_unique_constraint_name'); } };
上面的例子中,我们使用 addConstraint 方法在 Users 表中分别添加了 username 和 email 字段的唯一约束,并指定了唯一约束的名称为 custom_unique_constraint_name,这样就可以在数据库迁移中更加灵活地控制唯一键的条件和名称等信息。
需要注意的是,手动添加唯一键需要在数据库中手动添加索引以提高查询性能。
总结
通过本文的介绍,我们了解了在 Sequelize 中如何定义唯一键的三种方法。使用 unique 属性是最简便的方法,使用 validate 属性可以更加灵活地控制唯一键的条件和错误信息,手动添加唯一键可以在不同的数据库平台上使用相同的方法,并更加灵活地控制唯一键的条件和名称等信息。通过选择适合自己的方法,我们可以在 Sequelize 中轻松定义唯一键,避免了数据的冗余和重复。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6540ca9a7d4982a6eba5a53f