前言
Sequelize 是一个 Node.js 中 ORM 库,它支持多种数据库,包括 MySQL、PostgreSQL、SQLite 和 MSSQL 等等。Sequelize 能够很好地帮助我们进行数据库操作,实现数据的快速存储和读取。当我们需要在 Sequelize 中连接数据库时,有些人可能会遇到已存在的 MySQL 数据库无法连接的问题。这篇文章将详细介绍如何解决这个问题。
问题描述
使用 Sequelize 连接 MySQL 数据库时,有时候会出现已存在的数据库无法连接的情况。例如,当我们使用如下代码时:
const sequelize = new Sequelize(database, username, password, { host: host, dialect: 'mysql' });
其中,database
、username
、password
和 host
分别是该数据库的参数。当我们尝试连接一个已存在的 MySQL 数据库时,例如 testdb
,通常会报错:
Unhandled rejection SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306
这是因为 Sequelize 默认会尝试使用该名称创建新的数据库,而不是连接已经存在的数据库。那么,该如何解决呢?
解决方法
在 Sequelize 中连接已存在的 MySQL 数据库,我们需要设置配置项 define:{freezeTableName:true}
,以便使用现有的表。这样我们不需要创建对应的表,而是直接使用现有的表。修改代码如下:
const sequelize = new Sequelize(database, username, password, { host: host, dialect: 'mysql', define: { freezeTableName: true } });
这样,我们就可以成功连接一个已存在的 MySQL 数据库了。
示例代码
为了更好地理解,这里提供一个完整的示例代码。假设我们已经有一个名为 testdb
的 MySQL 数据库,其中包含有一个名为 users
的表,该表具有 id
和 name
两列。
const Sequelize = require('sequelize'); const database = 'testdb'; const username = 'root'; const password = 'root'; const host = 'localhost'; const sequelize = new Sequelize(database, username, password, { host: host, dialect: 'mysql', define: { freezeTableName: true } }); const User = sequelize.define('user', { id: { type: Sequelize.INTEGER, primaryKey: true }, name: Sequelize.STRING }, { timestamps: false }); User.findAll().then(users => { console.log(users); });
该示例中,我们使用 Sequelize 连接已存在的 MySQL 数据库,然后使用 User.findAll()
函数来查询 users
表中的所有记录,并将结果打印在控制台上。由于我们设置了 define:{freezeTableName:true}
,User
模型会直接映射到现有的 users
表上。运行该示例,我们可以看到控制台输出了 users
表中的所有记录:
[ { "id": 1, "name": "Jack" }, { "id": 2, "name": "Tom" } ]
总结
Sequelize 是一个非常强大的 ORM 库,它能够帮助我们更方便地进行数据库操作。当我们需要在 Sequelize 中连接一个已存在的 MySQL 数据库时,使用配置项 define:{freezeTableName:true}
可以解决无法连接的问题。希望这篇文章能够对大家有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a67842add4f0e0fff43399