首页 > 解决方案 > 错误:ER_NO_DB_ERROR:始终使用数据库限定对象引用时未选择数据库(Node.js + MySql)

问题描述

我想要实现的是能够通过使用数据库限定的表名访问两个数据库中的表(无需使用 SQLUSE语句专门设置默认数据库)。我在 Node.js v10.15.3 上运行的 JavaScript 应用程序使用 NPM mysql 2.17.1 库连接到 MySql,如下所示:

const mysql = require('mysql');

...

let configuration = {
    host: "localhost",
    port: 3306,
    user: "user",
    password: "password"
};

let connection = mysql.createConnection(configuration);

建立了连接,但是当我使用数据库限定的表名进行查询时

let select = 'SELECT COUNT(*) AS count FROM application.table;';

connection.query(select);

我得到:

(node:20332) UnhandledPromiseRejectionWarning: Error: ER_NO_DB_ERROR: No database selected

我的猜测是这个错误是 mysql NPM 库检测到我没有指定要使用的数据库,所以我尝试在 SELECT 语句之前添加以下内容:

connection.query(`USE application;`);

...现在我得到:

(node:10412) UnhandledPromiseRejectionWarning: Error: ER_NO_SUCH_TABLE: Table 'application.application.table' doesn't exist

因此,节点mysql库似乎在我引用任何数据库对象的任何地方都添加了数据库名称......

我实际上将数据库限定的表名存储为表单的 JavaScript 字符串,'application.table'或者'metadata.table'为了简化管理而更愿意以这种格式保存它们(例如,如果设计需要一个表从一个数据库移动到另一个数据库,我们只需要更改在一处引用表的字符串)。

是否有 Node mysql 库配置选项来确保所有数据库对象引用都是数据库限定的?

标签: mysqlnode.js

解决方案


MySQL节点包被设计成这样使用:

let configuration = {
    host: "localhost",
    port: 3306,
    user: "user",
    password: "password",
    database: "application" // Add database name here
};

您可以使用changeUser函数更改数据库,如下所示:

connection.changeUser({
    database : 'metadata'
}, (err) => {
    if (err) {
      console.log('Error in changing database', err);
      return;
    }
    // Do another query
})

据我所知,没有办法database.table使用 MySQL Node 包使用符号来查询数据库。

编辑: 我根据您的评论看到了一些东西。我认为可以做您想做的事情!看一下这个:

var options = {sql: '...', nestTables: '_'};
connection.query(options, function (error, results, fields) {
  if (error) throw error;
  /* results will be an array like this now:
  [{
    table1_fieldA: '...',
    table1_fieldB: '...',
    table2_fieldA: '...',
    table2_fieldB: '...',
  }, ...]
  */
});

似乎您可以传递分隔符nestTables或类似在查询中使用表名的东西!

默认情况下,node-mysql 将按照从 MySQL 接收列的顺序覆盖冲突的列名,导致某些接收到的值不可用。

但是,您也可以像这样指定您希望列嵌套在表名下方

所以我想这里有一个解决方法!没有更多的想法,对不起:/


推荐阅读