当前位置: 首页 > news >正文

Node.js SQL数据库:MySQL/PostgreSQL集成

引言:SQL数据库与Sequelize——关系型持久化的结构化力量

欢迎继续《Node.js 服务端开发》专栏的第四个模块!在上篇文章《MongoDB基础与Mongoose ODM》中,我们深入了MongoDB 8.2的安装、Schema模型定义和CRUD操作的Mongoose 8.19.2实践,帮助你掌握NoSQL的灵活性。现在,让我们转向关系型数据库(RDBMS):集成MySQL和PostgreSQL,使用Sequelize ORM。这不仅仅是存储结构化数据,更是处理关系、事务和优化的实践,帮助你从非结构化转向 ACID 保证的应用,如电商或金融系统。

随着Node.js Current版本25.0.0的成熟(于2025年10月15日发布,由@targos等贡献)和LTS版本22.21.0 'Jod’的稳定支持,Sequelize的最新版本7.2.0(于2025年9月15日发布)提供了更强劲的性能,如增强的TypeScript支持和PostgreSQL 17兼容。

Sequelize的历史源于2010年,由Sascha Depold创建,作为Node.js的ORM,支持多种方言。 从v1的基 pp 本查询,到v7.2.0的异步迁移和连接池优化,它已成为Express生态的标准。 为什么Sequelize?它抽象SQL,提供迁移、事务和池化,简化MySQL/PostgreSQL集成。 在2025年,v7.2.0的PostgreSQL 17支持和AI辅助查询,让它在企业级应用中闪耀。 准备好你的Node环境,让我们从安装开始,实践一个用户管理应用。

Sequelize ORM的使用:连接与模型定义

Sequelize是Node.js的ORM,支持MySQL、PostgreSQL等,抽象SQL为JS API。

安装Sequelize

npm install sequelize@7.2.0 mysql2 pg pg-hstore(mysql2 for MySQL, pg for PostgreSQL)。

连接(index.js):

const { Sequelize } = require('sequelize');
const sequelize = new Sequelize('mydb', 'user', 'pass', {host: 'localhost',dialect: 'mysql'  // 或 'postgres'
});sequelize.authenticate().then(() => console.log('Connected')).catch(err => console.error(err));

深度剖析:dialect指定方言,sequelize.sync()自动创建表。 历史:v1简单连接,v7.2.0添加异步authenticate。 性能:用环境变量配置。 误区:忽略dialect导致错误。

模型定义(user.js):

const { DataTypes } = require('sequelize');
const User = sequelize.define('User', {id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },name: { type: DataTypes.STRING, allowNull: false },email: { type: DataTypes.STRING, unique: true, allowNull: false },age: { type: DataTypes.INTEGER, validate: { min: 18 } }
}, { tableName: 'users', timestamps: true });module.exports = User;

深度:define创建模型,timestamps添加createdAt/updatedAt。 validate内置验证。

迁移脚本:数据库版本控制

迁移是Sequelize的CLI工具,管理schema变更。

安装CLI

npm install --save-dev sequelize-cli@6.6.2。 npx sequelize-cli init创建config/migrations/models。

config/config.json:

{"development": {"username": "user","password": "pass","database": "mydb","host": "127.0.0.1","dialect": "mysql"}
}

创建迁移:npx sequelize-cli migration:generate --name create-users

migrations/xxx-create-users.js:

module.exports = {up: async (queryInterface, Sequelize) => {await queryInterface.createTable('users', {id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true },name: { type: Sequelize.STRING, allowNull: false },email: { type: Sequelize.STRING, unique: true, allowNull: false },age: { type: Sequelize.INTEGER },createdAt: { type: Sequelize.DATE, allowNull: false },updatedAt: { type: Sequelize.DATE, allowNull: false }});},down: async (queryInterface, Sequelize) => {await queryInterface.dropTable('users');}
};

运行:npx sequelize-cli db:migrate

深度剖析:up应用变更,down回滚。 历史:v2引入CLI,v7.2.0优化异步迁移。 性能:批量迁移减停机。误区:忽略down导致不可逆。

最佳实践:用seeders填充数据,如npx sequelize-cli seed:generate。

事务处理:保证数据一致性

事务确保操作原子性。

示例:

async function transferMoney(fromId, toId, amount) {const t = await sequelize.transaction();try {await Account.update({ balance: Sequelize.literal(`balance - ${amount}`) }, { where: { id: fromId }, transaction: t });await Account.update({ balance: Sequelize.literal(`balance + ${amount}`) }, { where: { id: toId }, transaction: t });await t.commit();} catch (err) {await t.rollback();throw err;}
}

深度剖析:transaction创建事务,commit/rollback管理。 隔离级别:{ isolationLevel: Transaction.ISOLATION_LEVELS.READ_COMMITTED }。 性能:事务锁表,短事务优。误区:嵌套事务需managed模式。

最佳实践:用CLS (Continuation Local Storage)跨请求事务。

连接池配置:高效资源管理

连接池复用连接,减开销。

配置:

const sequelize = new Sequelize('mydb', 'user', 'pass', {host: 'localhost',dialect: 'mysql',pool: {max: 10,  // 最大连接min: 0,   // 最小acquire: 30000,  // 获取超时idle: 10000      // 空闲超时}
});

深度剖析:max限并发,idle释放闲置。 历史:v3引入池,v7.2.0优化动态调整。 性能:调max匹配负载,monitor sequelize.connectionManager.pool.size。 误区:过大max耗资源。

最佳实践:云如RDS用外部池;2025年,v7.2.0支持AI调优池。

MySQL vs PostgreSQL:2025对比与选择

以下表格总结:

维度MySQL (8.0+)PostgreSQL (17+)
存储引擎InnoDB默认,事务支持内置事务,MVCC
JSON支持好,内置函数优秀,JSONB二进制
扩展性复制/分片扩展插件如PostGIS
性能读重载优复杂查询优
Sequelize好支持优秀,GIS等

深度:PostgreSQL标准合规高,MySQL社区大。 2025趋势:PostgreSQL在AI向量搜索领先。

高级主题:关联、钩子与2025优化

  • 关联:User.hasMany(Post)关系。
  • 钩子:User.beforeCreate(async (user) => user.email = user.email.toLowerCase())。
  • 2025优化:v7.2.0的异步池,MySQL 8.0的JSON表。 趋势:Sequelize with Prisma混合。

结语:Sequelize,SQL集成的桥梁

通过Sequelize 7.2.0的使用、迁移、事务和池配置,你已掌握MySQL/PostgreSQL集成。 从2010起源,到2025的优化,它让Node.js应用更结构化。

http://www.dtcms.com/a/515495.html

相关文章:

  • 虚拟化网络连接与虚拟机嵌套
  • 无锡企业制作网站网站建设项目的费用做什么科目
  • Slack消息体->消息ID的设计
  • 如何轻松将 Outlook 联系人导出到 Excel
  • 图像尺寸测量仪应用Type-C接口:精准检测,赋能科技
  • C++仿mudo库高并发服务器项目:Buffer模块
  • 找能做网站的搜狗推广下架
  • 性能分析--perfetto工具使用
  • 【matlab】如何提取论文plot图中的数据
  • 手机网站开发的目的ppt免费背景图片
  • Java 核心知识点查漏补缺(一)
  • UE5 C++ CVar控制台命令字段使用
  • 从图像处理到AI识别:直播美颜sdk如何实现高效一键美颜?
  • ESD防护设计宝典(十三):电快速瞬变脉冲群(EFT)防护与整改
  • 做百度推广去些网站加客户二级域名免费申请网站
  • 婚介 东莞网站建设西部数码网站源码
  • 云计算实验4——CentOS中HBase的安装
  • Excel文件中的VBA脚本,在文件使用WPS编辑保存后无法执行
  • LLD(详细设计文档)输出标准模板
  • 【山西政务服务网-注册_登录安全分析报告】
  • 云原生安全深度实战:从容器安全到零信任架构
  • Java导出写入固定Excel模板数据
  • 合肥网站建设模板系统html怎么做商品页面
  • uniapp微信小程序页面跳转后定时器未清除问题解析与解决方案
  • 《从“直接对话”到 “集成开发调用”:智谱 GLM-4.6 引领 Coding 场景的效率跃迁》
  • 数据中心基础设施等级
  • 关于架空输电线识别树障or测距相关论文阅读
  • [go 面试] 深入理解并发控制:掌握锁的精髓
  • TypeScript 面试题及详细答案 100题 (61-70)-- 泛型(Generics)
  • 全球外贸网站制作教程icp网站快速备案