在 Sequelize 中,每个模型都应该有一个主键来标识一条数据。Sequelize 默认使用 id
字段作为主键,但是也可以使用自己的主键。除了自己设定主键之外,在 Sequelize 中还有一种被称为“虚拟主键”的概念。
什么是虚拟主键
虚拟主键实际上就是没有真正的主键字段,但是我们仍然可以操作它。在 Sequelize 中,虚拟主键可以由其中的一个或多个字段组成。这些字段的组合值将唯一标识一条数据。虚拟主键通常在没有自然主键(如 id
)的情况下使用。
虚拟主键的优点
无需创建一个额外的 id 列
使用虚拟主键可以避免创建一个额外的 id
列,这可以节省数据库空间和查询时间。在某些数据表中,这个额外列可能是不必要的。
可以使用自己的列作为主键
如果你不想使用 Sequelize 默认的 id
列作为主键,你可以使用自己的列来创建一个虚拟主键。
可以定义更复杂的主键
如果数据表没有一个天然主键,那么使用虚拟主键可以非常方便地定义更复杂的主键。
什么情况下使用虚拟主键
当你的数据表没有一个比其他字段更为适合的主键时,你可以使用虚拟主键。例如,你可能需要将用户表分为多个租户,每个租户可能都有一个唯一的用户编号。在这种情况下,你可以使用组合字段作为虚拟主键。
如何在 Sequelize 中使用虚拟主键
创建带有虚拟主键的模型
-- -------------------- ---- ------- ----- --------- - --------------------- ----- --------- - --- --------------------- ----------- ----------- - ----- ------------ -------- ------- --- ----- ---- - ------------------------ - ------ - ----- ----------------- ------- ---- -- --------- ---------------- -- - -------- - - ------- ----- ------- --------- ----------- - -- ----------- ----- --- ----------------- -------
在上面的代码中,我们使用了 email
和 username
作为虚拟主键。这个虚拟主键由这两个字段的组合值唯一标识一条记录。
使用虚拟主键进行查询
User.findByPk('1', { attributes: ['email', 'username'] }).then(user => { console.log(user.get({plain: true})); });
在上面的代码中,我们使用 findByPk
方法来查找一条用户记录。用于查找的参数为 '1'
,这里的 '1'
表示我们要查找主键为 '1'
的记录。虚拟主键的查找方式和普通主键查找方式一样。在我们的模型中,虚拟主键由 email
和 username
组成,参数 '1'
表示我们要查找 email
和 username
均为 1 的记录。
使用虚拟主键进行更新
User.update({username: 'new_username'}, { where: { email: 'test@example.com', username: 'test_username' } }).then(result => { console.log(result); });
在上面的代码中,我们使用 update
方法来更新用户记录。在使用虚拟主键进行更新时,我们要传递所有虚拟主键字段的值。
结论
使用虚拟主键可以使表结构更灵活,而不需要依赖自增的 id
等方式。当你面临没有自然主键的表时,使用虚拟主键会非常有用。现在你可以使用虚拟主键操作 Sequelize 中的数据表了。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66fbbb08447136260161418e