我想要实现的是通过使用数据库限定表名访问两个数据库中的表的能力(无需使用 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);
Run Code Online (Sandbox Code Playgroud)
连接已建立,但是当我使用数据库限定表名进行查询时
let select = 'SELECT COUNT(*) AS count FROM application.table;';
connection.query(select);
Run Code Online (Sandbox Code Playgroud)
我得到:
(node:20332) UnhandledPromiseRejectionWarning: Error: ER_NO_DB_ERROR: No database selected
Run Code Online (Sandbox Code Playgroud)
我的猜测是这个错误是 mysql NPM 库检测到我没有指定要使用的数据库,所以我尝试在 SELECT 语句之前添加以下内容:
connection.query(`USE application;`);
Run Code Online (Sandbox Code Playgroud)
...现在我得到:
(node:10412) UnhandledPromiseRejectionWarning: Error: ER_NO_SUCH_TABLE: Table 'application.application.table' doesn't exist
Run Code Online (Sandbox Code Playgroud)
因此,节点mysql库似乎在我引用任何数据库对象的任何地方都预先添加了数据库名称......
我实际上将数据库限定表名称存储为表单的 JavaScript 字符串'application.table'or 'metadata.table',并希望将它们保留为这种格式以简化管理(例如,如果设计需要将表从一个数据库移动到另一个数据库,我们只需要更改在一处引用该表的字符串)。
是否有 Node mysql 库配置选项来确保所有数据库对象引用都是数据库限定的?
MySQL 节点包被设计为这样使用:
let configuration = {
host: "localhost",
port: 3306,
user: "user",
password: "password",
database: "application" // Add database name here
};
Run Code Online (Sandbox Code Playgroud)
您可以使用changeUser函数更改数据库,如下所示:
connection.changeUser({
database : 'metadata'
}, (err) => {
if (err) {
console.log('Error in changing database', err);
return;
}
// Do another query
})
Run Code Online (Sandbox Code Playgroud)
据我所知,没有办法使用database.tableMySQL 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: '...',
}, ...]
*/
});
Run Code Online (Sandbox Code Playgroud)
似乎您可以传递分隔符nestTables或类似的东西来在查询中使用表名!
默认情况下,node-mysql 会按照从 MySQL 接收列的顺序覆盖冲突的列名称,从而导致某些接收到的值不可用。
但是,您也可以指定希望将列嵌套在表名称下方,如下所示
所以我想这里有一个解决方法!不知道更多了,抱歉:/
我发现我需要转义查询标识符,如下所示:
const mysql = require('mysql');
let connection = mysql.createConnection(configuration);
let select = `SELECT COUNT(*) AS count FROM ${mysql.escapeId('application.table')};`;
connection.query(select);
Run Code Online (Sandbox Code Playgroud)
虽然文档没有具体介绍引用数据库限定表的情况 - 使用escapeId()绝对克服了正在生成的错误。
我对幕后显然发生的魔法感到好奇。
| 归档时间: |
|
| 查看次数: |
14076 次 |
| 最近记录: |