Node.js 是一个开源与跨平台的 JavaScript 运行时环境。其在浏览器外运行 V8 JavaScript 引擎,这使得 Node.js 的性能表现非常出色,也使得 Node.js 在服务端开发领域占据一席之地。
对于数据库的操作,最简单直接的方法是编写并执行原生 SQL。然而,也有不少开发者使用数据库 ORM(对象关系映射),对数据库操作进行更高层次的抽象,以获得可读性更高、更易维护的数据操作逻辑代码。
Sequelize.js,就是在 Node.js 服务端开发中,一个功能强大的数据库 ORM 库。
Sequelize.js,是 sequelize 组织在 Github 上开源的 Node.js 数据库 ORM 库,目前版本为 v6.5.0。
Sequelize 完全使用 Javascript 开发,使用基于 Promise 的异步机制。其支持多种数据库,包括 Postgres, MySQL, MaraiaDB, SQLitet 和 MSSQL。Sequelize 提供了事务支持,懒加载和尽早加载等数据库功能支持,功能强大。
目前,Sequelize.js 已被广泛使用在 Node.js 服务端项目中,支撑着许许多多服务的数据库连接、查询和操作,使用便捷,开发效率高,功能丰富,值得尝试。
要在 Node.js 项目中使用 Sequelize,首先进行依赖安装,使用 NPM 或 YARN 安装:
npm install --save sequelize
另外,针对不同的数据库,还需要安装对应的数据库驱动库:
$ npm install --save pg pg-hstore # Postgres$ npm install --save mysql2$ npm install --save mariadb$ npm install --save sqlite3$ npm install --save tedious # Microsoft SQL Server
安装完成,并部署好相关的数据库后,就可以在 Node.js 项目中使用了。
首先是连接数据库。Sequelize 可以直接解析数据库连接 URI 来创建连接:
const { Sequelize } = require('sequelize');const sequelize = new Sequelize('sqlite::memory:') // Example for sqliteconst sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname') // Example for postgres
也可以提供参数对象来配置连接:
const { Sequelize } = require('sequelize');const sequelize = new Sequelize('database', 'username', 'password', { host: 'localhost', dialect: 'mysql'});
完成数据库连接后,对于 ORM 而言,其需要把数据库里 SQL 定义的数据模型,映射到 Node.js 里的数据模型来,所以,我们需要进行数据模型的定义。我们来看一个简单的例子:
const { Sequelize, DataTypes } = require('sequelize');const sequelize = new Sequelize('sqlite::memory:');const User = sequelize.define('User', { firstName: { type: DataTypes.STRING, allowNull: false }, lastName: { type: DataTypes.STRING }}, { // Other model options go here});console.log(User === sequelize.models.User); // true
在这个例子中,我们定义了一个表示用户的数据模型,包括了每个数据域的类型和相关参数。
完成定义后,我们可以来进行简单的数据库操作了。首先,我们插入一条数据,直接使用数据模型 User 的 create 方法来进行:
const jane = await User.create({ firstName: "Jane", lastName: "Doe" });console.log("Jane's auto-generated ID:", jane.id);
然后,再进行查询,使用 findAll,查询返回该数据表的所有数据:
const users = await User.findAll();console.log(users.every(user => user instanceof User)); // trueconsole.log("All users:", JSON.stringify(users, null, 2));
此时,我们可以看到,在命令行输出了我们之前插入的数据。对于 findAll,我们还可以添加 where 查询选项,对应 SQL 里面的 WHERE 字句:
Post.findAll({ where: { authorId: 12 status: 'active' }});
Sequelize.js 实现了 Node.js 的数据库 ORM,把 SQL 数据库里的数据表,映射为 Node.js 中的数据模型,并实现了众多的数据操作查询,使用抽象层级更高的 JS 方法,实现数据操作。
Sequelize.js 使用便捷,功能强大,基本覆盖了 SQL 数据库的日常使用操作,并提供了一个高级功能的实现。对于使用 Node.js 进行服务端开发的开发者而言,Sequelize.js 无疑是进行数据库操作的首选之一。