模型的基础操作
模型是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$/})