Sequelize 中连接已存在的 MySQL 数据库出现错误的解决办法

前言

Sequelize 是一个 Node.js 中 ORM 库,它支持多种数据库,包括 MySQL、PostgreSQL、SQLite 和 MSSQL 等等。Sequelize 能够很好地帮助我们进行数据库操作,实现数据的快速存储和读取。当我们需要在 Sequelize 中连接数据库时,有些人可能会遇到已存在的 MySQL 数据库无法连接的问题。这篇文章将详细介绍如何解决这个问题。

问题描述

使用 Sequelize 连接 MySQL 数据库时,有时候会出现已存在的数据库无法连接的情况。例如,当我们使用如下代码时:

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

其中,databaseusernamepasswordhost 分别是该数据库的参数。当我们尝试连接一个已存在的 MySQL 数据库时,例如 testdb,通常会报错:

这是因为 Sequelize 默认会尝试使用该名称创建新的数据库,而不是连接已经存在的数据库。那么,该如何解决呢?

解决方法

在 Sequelize 中连接已存在的 MySQL 数据库,我们需要设置配置项 define:{freezeTableName:true},以便使用现有的表。这样我们不需要创建对应的表,而是直接使用现有的表。修改代码如下:

const sequelize = new Sequelize(database, username, password, {
  host: host,
  dialect: 'mysql',
  define: {
    freezeTableName: true
  }
});

这样,我们就可以成功连接一个已存在的 MySQL 数据库了。

示例代码

为了更好地理解,这里提供一个完整的示例代码。假设我们已经有一个名为 testdb 的 MySQL 数据库,其中包含有一个名为 users 的表,该表具有 idname 两列。

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 表中的所有记录:

总结

Sequelize 是一个非常强大的 ORM 库,它能够帮助我们更方便地进行数据库操作。当我们需要在 Sequelize 中连接一个已存在的 MySQL 数据库时,使用配置项 define:{freezeTableName:true} 可以解决无法连接的问题。希望这篇文章能够对大家有所帮助。

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


纠错反馈