mysql - 始终使用数据库限定对象引用时出现错误 : ER_NO_DB_ERROR: No database selected (Node. js + MySql)

标签 mysql node.js

我想要实现的是通过使用数据库限定表名访问两个数据库中的表的能力(无需使用 SQL USE 语句专门设置默认数据库)。我在 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

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

我实际上将数据库限定表名称存储为 'application.table''metadata.table' 形式的 JavaScript 字符串,并且更愿意保留这些采用这种格式是为了简化管理(例如,如果设计需要将表从一个数据库移动到另一个数据库,我们只需更改在一个位置引用该表的字符串)。

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

最佳答案

MySQL Node 包被设计为这样使用:

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
})

据我所知,无法使用 MySQL Node 包使用 database.table 表示法查询数据库。

编辑: 我根据您的评论看到了一些内容..我认为可以做您想做的事! 看看这个:

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或类似在查询中使用表名称的内容!

By default, node-mysql will overwrite colliding column names in the order the columns are received from MySQL, causing some of the received values to be unavailable.

However, you can also specify that you want your columns to be nested below the table name like this

所以我想这里有一个解决方法!不知道更多了,抱歉:/

关于mysql - 始终使用数据库限定对象引用时出现错误 : ER_NO_DB_ERROR: No database selected (Node. js + MySql),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57598136/

相关文章:

php - mysql group_concat 里面 while

mysql - 如何为gorm组织多个外键

mysql - MySQL中的CHECK约束不起作用

node.js - 查看管道错误中的管道数据

java - 项目执行时本地自动转储数据库数据

python - 将 Python 与 MySQL 结合使用

javascript - 在 JavaScript 中同时声明变量和函数

node.js - 使用 docker 进行 Node 开发的工作流程

javascript - 在 sails js 中获取更新查询的问题

node.js - 无法启用react-simple-chatbot NPM模块中的输入字段