Express.js 中使用 Sequelize 进行 ORM 操作

Express.js 中使用 Sequelize 进行 ORM 操作

Sequelize 是一个 Node.js 的 ORM(Object-Relational Mapping)框架,用于操作关系型数据库,如 MySQL、PostgreSQL、SQLite 等。它支持 Promise、事务、模型定义、查询构建器和外键等功能,提供了方便简洁的操作数据库的 API。

在 Express.js 中,通过 Sequelize 可以轻松地进行数据库操作,并且可以提高开发效率和代码质量。本文详细介绍了如何在 Express.js 中使用 Sequelize 进行 ORM 操作。

安装和配置 Sequelize

在项目中安装 Sequelize:

同时,还需安装适用于所使用数据库的驱动程序,如 mysql2、pg、sqlite3 等。以 mysql2 为例:

在使用 Sequelize 之前,还需要将其初始化。通过以下代码,创建 Sequelize 实例:

const Sequelize = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
    dialect: 'mysql2', //数据库类型
    host: 'localhost', //数据库主机地址
});

创建 Sequelize 实例时,需要传入数据库名称、用户名和密码等相关信息。还可以通过 host、port、timezone 等配置项,进行更详细的配置。

创建模型

在 Sequelize 中,模型以 JavaScript 类的形式存在,对应着数据库中的表。定义模型时,需要指定模型名称、表名、字段、关联等信息。

以创建名为 User、对应着 users 表的模型为例:

const Sequelize = require('sequelize');
const Model = Sequelize.Model;

class User extends Model {}

User.init({
    // 属性
    username: {
        type: Sequelize.STRING,
        allowNull: false,
    },
    password: {
        type: Sequelize.STRING,
        allowNull: false,
    },
}, {
    sequelize, // 连接对象
    modelName: 'user', // 模型名称
    tableName: 'users', // 表名
    timestamps: false, // 是否启用时间戳字段
});

在模型中定义属性时,需要指定每个属性的数据类型、是否允许为空、默认值等信息。同时,还可以通过 timestamps、paranoid 等选项,设置模型中存在的时间戳字段和软删除等功能。

进行基本的 CRUD 操作

在创建好模型之后,可以进行基本的 CRUD(Create, Read, Update, Delete)操作,对数据库进行读写。

  • 创建(Create)操作
User.create({
    username: 'Alice',
    password: '123456',
}).then(user => {
    console.log(user.toJSON());
});
  • 读(Read)操作
User.findByPk(1).then(user => {
    console.log(user.toJSON());
});

User.findOne({
    where: {
        username: 'Alice',
    },
}).then(user => {
    console.log(user.toJSON());
});

User.findAll().then(users => {
    console.log(users.map(user => user.toJSON()));
});
  • 更新(Update)操作
User.update({
    password: '654321',
}, {
    where: {
        username: 'Alice',
    },
}).then(result => {
    console.log(result);
});
  • 删除(Delete)操作
User.destroy({
    where: {
        username: 'Alice',
    },
}).then(result => {
    console.log(result);
});

进行事务管理(Transaction)

在数据库操作过程中,可能会涉及到多个表的操作,需要保证操作的原子性,即要么全部成功,要么全部失败。此时,可以使用事务管理。

事务使用 Sequelize 的 transaction 函数创建,同时,在每次对数据库进行操作时,需要将事务对象传递给相关函数。

以在创建用户的同时,创建一个令牌(Token)为例:

sequelize.transaction(function (t) {
    return User.create({
        username: 'Bob',
        password: '123456',
    }, {
        transaction: t,
    }).then(user => {
        return Token.create({
            userId: user.id,
            token: 'abcdefg',
        }, {
            transaction: t,
        });
    });
}).then(result => {
    console.log('Transaction committed.');
}).catch(err => {
    console.error('Transaction rolled back.');
});

在创建事务时,需要先创建一个 Sequelize 实例。在创建模型时,需要将其传递给模型的初始化函数。

const sequelize = new Sequelize('database', 'username', 'password', {
    dialect: 'mysql2',
    host: 'localhost',
});

const User = sequelize.define('user', {
    // 属性
    username: {
        type: Sequelize.STRING,
        allowNull: false,
    },
    password: {
        type: Sequelize.STRING,
        allowNull: false,
    },
});

const Token = sequelize.define('token', {
    // 属性
    userId: {
        type: Sequelize.INTEGER,
        allowNull: false,
    },
    token: {
        type: Sequelize.STRING,
        allowNull: false,
    },
});

总结

本文简单介绍了在 Express.js 中使用 Sequelize 进行 ORM 操作的步骤。在实际开发中,还涉及到模型关联、查询构建器等高级功能,需要进行进一步的学习和实践。

在使用 Sequelize 进行 ORM 操作时,需要注意安全性问题,避免 SQL 注入等安全漏洞的发生。同时,还需要合理地使用事务管理等功能,保证操作的原子性和完整性,提高代码质量和可维护性。

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