前言
Sequelize 是一款 Node.js ORM(Object-Relational Mapping)工具,可与多种关系型数据库进行交互,例如 MySQL,PostgreSQL,SQLite 等。Sequelize 提供了定义数据模型的方式,使开发者能够更加灵活地设计数据库表结构。
在本文中,我们将详细讲解 Sequelize 中定义数据模型的各个方面。
安装
首先,我们需要安装 Sequelize 和相应的数据库驱动,以 MySQL 为例:
npm install --save sequelize sequelize-cli mysql2
其中,sequelize-cli 是 Sequelize 的命令行工具,mysql2 是 MySQL 驱动。
定义模型
Sequelize 中的模型可以看作是数据库中表的抽象。我们可以使用模型来进行增删改查操作。模型定义需要包含以下内容:
- 模型名称
- 字段定义
- 数据表名
- 模型配置
- 关联关系
字段定义
在 Sequelize 中,我们可以定义字段的类型、长度、是否允许为空以及默认值等属性。以下是一些常用字段类型的定义方式:
// www.javascriptcn.com code example
const { DataTypes } = require('sequelize');
const User = sequelize.define('User', {
// INTEGER
age: {
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: 0
},
// STRING
name: {
type: DataTypes.STRING,
allowNull: false
},
// DATE
birthday: {
type: DataTypes.DATE,
allowNull: true,
defaultValue: new Date()
},
// BOOLEAN
isActive: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: true
}
});数据表名
默认情况下,Sequelize 会将模型名称转换成复数形式作为表名。例如,如果我们定义了一个名为 User 的模型,则对应的数据表名为 users。如果不想使用默认数据表名,可以在定义模型时指定 tableName 属性。
const User = sequelize.define('User', {
// ...
}, {
tableName: 'users'
});模型配置
模型配置包括模型名称、数据表名、数据表引擎等属性。以下为一些常用的配置:
// www.javascriptcn.com code example
const User = sequelize.define('User', {
// ...
}, {
// 禁止 Sequelize 自动添加时间戳字段(createdAt 和 updatedAt)
timestamps: false,
// 数据表引擎,默认为 InnoDB
engine: 'InnoDB',
// 字符集
charset: 'utf8mb4'
});关联关系
在 Sequelize 中,我们可以建立不同模型之间的关联关系,以便于进行复杂的查询操作。
以下为一些常见的关联关系:
- 一对一:belongsTo 和 hasOne
- 一对多:hasMany
- 多对多:belongsToMany
下面是使用 belongsTo 和 hasMany 建立一对多关系的示例:
// www.javascriptcn.com code example
const User = sequelize.define('User', {
// ...
});
const Post = sequelize.define('Post', {
// ...
});
User.hasMany(Post);
Post.belongsTo(User);这样,我们就能够通过 User 模型访问 Post 模型的数据。
示例代码
以下是一个简单的示例,展示了如何使用 Sequelize 定义一个简单的用户表 User:
// www.javascriptcn.com code example
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('mysql://user:pass@localhost:3306/mydatabase');
const User = sequelize.define('User', {
id: {
type: DataTypes.INTEGER.UNSIGNED,
autoIncrement: true,
primaryKey: true
},
name: {
type: DataTypes.STRING,
allowNull: false
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true
},
password: {
type: DataTypes.STRING,
allowNull: false
},
createdAt: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
},
updatedAt: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
}
}, {
tableName: 'users',
timestamps: true,
underscored: true,
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci'
});
(async () => {
await sequelize.authenticate();
console.log('Connection has been established successfully.');
await sequelize.sync({ force: true });
console.log('All tables were created successfully.');
const user = await User.create({
name: 'John Doe',
email: 'john@example.com',
password: 'password'
});
console.log(`User with id ${user.id} has been created.`);
})();在上面的示例代码中,我们定义了一个 User 模型,包含了 id、name、email、password、createdAt 和 updatedAt 字段。其中,id 字段为自增主键,createdAt 和 updatedAt 字段为 Sequelize 自动生成的时间戳字段。模型的 tableName 属性指定了数据表名为 users。
在程序运行时,我们先进行数据库连接,并使用 authenticate 方法验证连接是否成功。然后,我们调用 sync 方法创建数据表。由于我们设置了 force 参数为 true,表示将强制删除已存在的数据表并重新创建。最后,我们通过 create 方法创建了一个用户。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d79ac2a941bf7134d9d2e1