前言
Sequelize 是一个 Node.js ORM 框架,支持多种数据库,包括 MySQL、PostgreSQL、SQLite 和 Microsoft SQL Server 等。它是一个非常强大的工具,可以帮助我们轻松地完成数据库操作,提高开发效率。在 Sequelize 中,模型 (Model) 是一个非常重要的概念,它相当于数据库中的表。本文将详细介绍 Sequelize 中的模型,包括模型的定义、关联关系、实例方法和类方法等。
模型的定义
在 Sequelize 中,我们可以通过 define 方法来定义一个模型。define 方法接受两个参数,第一个参数是模型的名称,第二个参数是模型的属性。下面是一个简单的例子:
// javascriptcn.com 代码示例 const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize('sqlite::memory:'); const User = sequelize.define('User', { username: { type: DataTypes.STRING, allowNull: false }, password: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, allowNull: false, unique: true } }); console.log(User === sequelize.models.User); // true
在上面的例子中,我们定义了一个名为 User 的模型,它有三个属性:username、password 和 email。其中,username 和 password 的类型都是字符串,且不能为空,而 email 的类型也是字符串,但是还要求唯一。
模型的关联关系
在 Sequelize 中,模型之间可以建立多种关联关系,包括一对一、一对多、多对多等。下面是一些常用的关联关系的示例:
一对一关系
在 Sequelize 中,一对一关系可以通过 hasOne 和 belongsTo 方法来建立。hasOne 方法表示一个模型拥有另一个模型的实例,而 belongsTo 方法表示一个模型属于另一个模型的实例。下面是一个简单的例子:
// javascriptcn.com 代码示例 const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize('sqlite::memory:'); const User = sequelize.define('User', { username: { type: DataTypes.STRING, allowNull: false }, password: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, allowNull: false, unique: true } }); const Profile = sequelize.define('Profile', { firstName: { type: DataTypes.STRING, allowNull: false }, lastName: { type: DataTypes.STRING, allowNull: false } }); User.hasOne(Profile); Profile.belongsTo(User); (async () => { await sequelize.sync({ force: true }); const user = await User.create({ username: 'user1', password: 'password1', email: 'user1@example.com' }); const profile = await Profile.create({ firstName: 'John', lastName: 'Doe' }); await user.setProfile(profile); const userWithProfile = await User.findByPk(user.id, { include: [Profile] }); console.log(userWithProfile.toJSON()); })();
在上面的例子中,我们定义了两个模型:User 和 Profile。其中,User 模型拥有一个 Profile 实例,而 Profile 模型属于一个 User 实例。在代码中,我们通过 hasOne 和 belongsTo 方法来建立一对一关系。
一对多关系
在 Sequelize 中,一对多关系可以通过 hasMany 和 belongsTo 方法来建立。hasMany 方法表示一个模型拥有多个另一个模型的实例,而 belongsTo 方法表示一个模型属于另一个模型的实例。下面是一个简单的例子:
// javascriptcn.com 代码示例 const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize('sqlite::memory:'); const User = sequelize.define('User', { username: { type: DataTypes.STRING, allowNull: false }, password: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, allowNull: false, unique: true } }); const Post = sequelize.define('Post', { title: { type: DataTypes.STRING, allowNull: false }, content: { type: DataTypes.STRING, allowNull: false } }); User.hasMany(Post); Post.belongsTo(User); (async () => { await sequelize.sync({ force: true }); const user = await User.create({ username: 'user1', password: 'password1', email: 'user1@example.com' }); const post1 = await Post.create({ title: 'post1', content: 'content1' }); const post2 = await Post.create({ title: 'post2', content: 'content2' }); await user.addPosts([post1, post2]); const userWithPosts = await User.findByPk(user.id, { include: [Post] }); console.log(userWithPosts.toJSON()); })();
在上面的例子中,我们定义了两个模型:User 和 Post。其中,User 模型拥有多个 Post 实例,而 Post 模型属于一个 User 实例。在代码中,我们通过 hasMany 和 belongsTo 方法来建立一对多关系。
多对多关系
在 Sequelize 中,多对多关系可以通过 belongsToMany 方法来建立。belongsToMany 方法表示两个模型之间互相拥有多个实例。下面是一个简单的例子:
// javascriptcn.com 代码示例 const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize('sqlite::memory:'); const User = sequelize.define('User', { username: { type: DataTypes.STRING, allowNull: false }, password: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, allowNull: false, unique: true } }); const Group = sequelize.define('Group', { name: { type: DataTypes.STRING, allowNull: false } }); User.belongsToMany(Group, { through: 'UserGroup' }); Group.belongsToMany(User, { through: 'UserGroup' }); (async () => { await sequelize.sync({ force: true }); const user1 = await User.create({ username: 'user1', password: 'password1', email: 'user1@example.com' }); const user2 = await User.create({ username: 'user2', password: 'password2', email: 'user2@example.com' }); const group1 = await Group.create({ name: 'group1' }); const group2 = await Group.create({ name: 'group2' }); await user1.addGroup(group1); await user2.addGroup(group1); await user2.addGroup(group2); const user1WithGroups = await User.findByPk(user1.id, { include: [Group] }); const user2WithGroups = await User.findByPk(user2.id, { include: [Group] }); console.log(user1WithGroups.toJSON()); console.log(user2WithGroups.toJSON()); })();
在上面的例子中,我们定义了两个模型:User 和 Group。其中,User 和 Group 之间互相拥有多个实例。在代码中,我们通过 belongsToMany 方法来建立多对多关系。
模型的实例方法
在 Sequelize 中,模型实例拥有许多方法,可以方便我们进行数据库操作。下面是一些常用的实例方法的示例:
create 方法
create 方法可以用来创建一个模型实例。下面是一个简单的例子:
// javascriptcn.com 代码示例 const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize('sqlite::memory:'); const User = sequelize.define('User', { username: { type: DataTypes.STRING, allowNull: false }, password: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, allowNull: false, unique: true } }); (async () => { await sequelize.sync({ force: true }); const user = await User.create({ username: 'user1', password: 'password1', email: 'user1@example.com' }); console.log(user.toJSON()); })();
在上面的例子中,我们通过 create 方法来创建了一个名为 user1 的用户。
save 方法
save 方法可以用来保存一个模型实例。下面是一个简单的例子:
// javascriptcn.com 代码示例 const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize('sqlite::memory:'); const User = sequelize.define('User', { username: { type: DataTypes.STRING, allowNull: false }, password: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, allowNull: false, unique: true } }); (async () => { await sequelize.sync({ force: true }); const user = await User.create({ username: 'user1', password: 'password1', email: 'user1@example.com' }); user.username = 'user2'; await user.save(); console.log(user.toJSON()); })();
在上面的例子中,我们通过 save 方法来更新了一个名为 user1 的用户的用户名。
destroy 方法
destroy 方法可以用来删除一个模型实例。下面是一个简单的例子:
// javascriptcn.com 代码示例 const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize('sqlite::memory:'); const User = sequelize.define('User', { username: { type: DataTypes.STRING, allowNull: false }, password: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, allowNull: false, unique: true } }); (async () => { await sequelize.sync({ force: true }); const user = await User.create({ username: 'user1', password: 'password1', email: 'user1@example.com' }); await user.destroy(); console.log(user.toJSON()); })();
在上面的例子中,我们通过 destroy 方法来删除了一个名为 user1 的用户。
模型的类方法
在 Sequelize 中,模型类也拥有许多方法,可以方便我们进行数据库操作。下面是一些常用的类方法的示例:
findAll 方法
findAll 方法可以用来查询多个模型实例。下面是一个简单的例子:
// javascriptcn.com 代码示例 const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize('sqlite::memory:'); const User = sequelize.define('User', { username: { type: DataTypes.STRING, allowNull: false }, password: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, allowNull: false, unique: true } }); (async () => { await sequelize.sync({ force: true }); const user1 = await User.create({ username: 'user1', password: 'password1', email: 'user1@example.com' }); const user2 = await User.create({ username: 'user2', password: 'password2', email: 'user2@example.com' }); const users = await User.findAll(); console.log(users.map(user => user.toJSON())); })();
在上面的例子中,我们通过 findAll 方法来查询了所有的用户。
findByPk 方法
findByPk 方法可以用来查询一个模型实例。下面是一个简单的例子:
// javascriptcn.com 代码示例 const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize('sqlite::memory:'); const User = sequelize.define('User', { username: { type: DataTypes.STRING, allowNull: false }, password: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, allowNull: false, unique: true } }); (async () => { await sequelize.sync({ force: true }); const user1 = await User.create({ username: 'user1', password: 'password1', email: 'user1@example.com' }); const user = await User.findByPk(user1.id); console.log(user.toJSON()); })();
在上面的例子中,我们通过 findByPk 方法来查询了一个名为 user1 的用户。
总结
在本文中,我们详细介绍了 Sequelize 中的模型,包括模型的定义、关联关系、实例方法和类方法等。通过本文的学习,相信大家已经对 Sequelize 的模型有了更深入的了解,可以在实际开发中更加灵活地应用。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/655b3141d2f5e1655d55d9c8