Skip to main content

模型的基础操作

模型是Sequelize的本质,模型代表数据库中表的抽象,在Sequelize中,它是Model的扩展累

通过模型代表如表名,表的列(列名,列数据类型)

模型定义

在Sequelize中,可以使用两种方式来定义模型:

  • 调用sequelize.define(moduleName, attributes, options)
  • 扩展Model并调用init(attributes, options)

在本例中,我们定义一个名为User的模型,模型拥有name和age两个属性,并将对应的数据表在数据库中命名为Users。

可以通过以下两种方式定义该模型。定义之后,可以通过sequelize.models.User访问该模型。

一、使用sequelize.define定义

const User = sequelize.define('User', {
name: {
type: DataTypes.STRING
},
age: {
type: DataTypes.NUMBER
},
})
console.log(User === sequelize.models.User) // true

二、使用扩展Model定义

class Class extends Model { }
User.init({
name: {
type: DataTypes.STRING
},
age: {
type: DataTypes.NUMBER
}
}, {
sequelize, // Sequelize的实例
modelName: 'User' // 模型名称
})
console.log(User === sequelize.models.User) // true

模型定义数据库表名

以上的示例都没有提供数据库表的名称,它们通过模型名称 User 推断表名为 Users。

默认情况下,如果未提供表名,Sequelize 自动将模型名称转换为复数形式作为表名。

将表名设置为与模型名称相同

sequelize.define('User', {
// ... (属性)
}, {
freezeTableName: true
});

可以在全局范围内定义

const sequelize = new Sequelize('sqlite::memory:', {
define: {
freezeTableName: true
}
});

自定义表名

sequelize.define('User', {
// ... (属性)
}, {
tableName: 'Employees'
});

模型同步

在定义模型时,需要告诉Sequelize有关数据库表的一些信息。如果该表在数据库中不存在,或者虽然存在但是数据库记录的列的信息可能与模型中的不同,因此需要进行同步。

设置model.sync(options)Sequelize将自动对数据库执行SQL查询

  • User.sync() 如果表不存在,则创建;否则,不执行操作
  • User.sync({force: true}) 若表存在,则删除并创建
  • User.sync({alter: true}) 将表的信息与模型对齐,比如列和列的数据类型

一次性同步所有模型

await sequelize.sync({ force: true });

增加安全检查

通过match可以接受RegExp,如下限制只有_test结尾的才生效

sequelize.sync({force: true, match: /_test$/})