我要实现的目标是能够通过使用数据库限定的表名来访问两个数据库中的表(无需使用SQL reinterpret_cast
语句专门设置默认数据库)。我在Node.js v10.15.3上运行的JavaScript应用程序通过NPM mysql 2.17.1库连接到MySql,如下所示:
USE
已建立连接,但是当我使用数据库限定的表名查询时
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);
我的猜测是此错误是mysql NPM库检测到我没有指定要使用的数据库,因此我尝试在SELECT语句之前添加以下内容:
(node:20332) UnhandledPromiseRejectionWarning: Error: ER_NO_DB_ERROR: No database selected
...现在我得到:
connection.query(`USE application;`);
因此,在我引用任何数据库对象的任何地方,节点(node:10412) UnhandledPromiseRejectionWarning: Error: ER_NO_SUCH_TABLE: Table 'application.application.table' doesn't exist
库似乎都在数据库名称之前...
我实际上是将数据库限定表名存储为mysql
或'application.table'
形式的JavaScript字符串,并且为了简化管理(例如,如果设计要求使用表从一个数据库移到另一个数据库,我们只需要在一个地方更改引用该表的字符串即可。
是否有Node mysql库配置选项来确保所有数据库对象引用都符合数据库标准?
答案 0 :(得分:0)
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
})
据我所知,无法通过MySQL节点包使用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
或类似在查询中使用表名的东西!
默认情况下,node-mysql将按照从MySQL接收列的顺序覆盖冲突的列名称,从而导致某些接收到的值不可用。
但是,您还可以指定希望将列嵌套在这样的表名下方
所以我想这里有一个解决方法!没有更多的主意,对不起:/
答案 1 :(得分:0)
我发现我需要按以下说明转义查询标识符:
const mysql = require('mysql');
let connection = mysql.createConnection(configuration);
let select = `SELECT COUNT(*) AS count FROM ${mysql.escapeId('application.table')};`;
connection.query(select);
尽管文档中没有专门介绍引用数据库限定表的情况-使用escapeId()
绝对可以克服所产生的错误。
我很想知道幕后似乎正在发生的魔术。
答案 2 :(得分:0)
解决方案更简单:
let configuration = {
database: "application" //name -> database is required
};