Sequelize 中如何定义模型的主键

Sequelize 是 Node.js 的一个 ORM 框架,它支持多种数据库类型,并提供了方便的增删改查操作。在定义 Sequelize 模型时,我们通常需指定模型的主键字段。本文将介绍 Sequelize 中如何定义模型的主键,帮助读者更好地了解 Sequelize 的使用。

主键介绍

在数据库中,主键是区分表中不同记录的标识符。它具有唯一性,不可重复,还能为表中记录提供快速查找和索引的支持。在 Sequelize 中,如果不指定主键字段,它会自动创建一个名为 id 的字段作为主键,类型为整数自增。

定义主键

在 Sequelize 中,我们可以通过指定 primaryKey 属性来定义模型的主键字段。如下所示:

const User = sequelize.define('user', {
  // id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true },
  username: { type: DataTypes.STRING, allowNull: false },
  password: { type: DataTypes.STRING, allowNull: false }
}, {
  tableName: 'users'
});

在上述代码中,我们不定义 id 字段,而是通过 primaryKey 属性将 username 字段设置为主键。这样,Sequelize 将自动生成合适的 SQL 语句以创建该字段并将其设置为主键。primaryKey 属性的值可以是一个字符串形式的字段名,也可以是一个对象形式,指定其他选项。例如:

const Order = sequelize.define('order', {
  orderNum: { type: DataTypes.STRING, allowNull: false },
  totalPrice: { type: DataTypes.DECIMAL(10, 2), allowNull: false },
  paidAt: { type: DataTypes.DATE }
}, {
  tableName: 'orders',
  primaryKey: {
    name: 'order_id',
    type: DataTypes.INTEGER,
    autoIncrement: true
  }
});

在上述代码中,我们定义了一个名为 order_id 的字段作为主键,类型为整数自增。这也是另一种常见主键定义方式。

复合主键

有些情况下,一个表中可能需要两个或更多字段作为主键,这被称为复合主键。在 Sequelize 中,我们可以通过在 primaryKey 属性中指定多个字段来实现复合主键。例如:

const OrderDetail = sequelize.define('order_detail', {
  orderId: { type: DataTypes.INTEGER, allowNull: false },
  productId: { type: DataTypes.INTEGER, allowNull: false },
  quantity: { type: DataTypes.INTEGER, allowNull: false }
}, {
  tableName: 'order_details',
  primaryKey: ['orderId', 'productId']
});

在上述代码中,我们通过将 primaryKey 属性设置为一个由两个字段组成的数组来定义复合主键。这样,Sequelize 将自动生成合适的 SQL 语句以创建这两个字段并将它们设置为主键。复合主键提供了更具灵活性和可扩展性的设计,但在实现时需要注意一些问题,以免造成潜在的问题。

总结

在 Sequelize 中,我们通过指定 primaryKey 属性来定义模型的主键字段。该属性可以是一个字符串形式的字段名,也可以是一个对象形式,指定其他选项。此外,我们还可以通过在 primaryKey 属性中指定多个字段来实现复合主键。在使用 Sequelize 时,请根据实际情况设置主键,并注意一些特殊场景下的设计和实现问题。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659681efeb4cecbf2da51f5e


纠错反馈