Nodejs node-mysql source命令如何使用?

Nodejs node-mysql source命令如何使用?

求教,如题, node-mysql中直接使用source语句,直接报错,有没有办法解决?

4 回复

求教,如题, node-mysql中直接使用source语句,直接报错,有没有办法解决?


附上测试代码及相应错误信息

conn1.query('source test.sql', function(err, result) {
    if(err) {
        console.log(err.stack);
    }   
    else {
        console.log('exec source success');
    }   
});
> ~             

Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘source test.sql’ at line 1 at Query.Sequence._packetToError (/root/yanqiang/web/node_modules/mysql/lib/protocol/sequences/Sequence.js:48:14) at Query.ErrorPacket (/root/yanqiang/web/node_modules/mysql/lib/protocol/sequences/Query.js:82:18) at Protocol._parsePacket (/root/yanqiang/web/node_modules/mysql/lib/protocol/Protocol.js:270:23) at Parser.write (/root/yanqiang/web/node_modules/mysql/lib/protocol/Parser.js:77:12) at Protocol.write (/root/yanqiang/web/node_modules/mysql/lib/protocol/Protocol.js:39:16) at Socket.<anonymous> (/root/yanqiang/web/node_modules/mysql/lib/Connection.js:82:28) at Socket.emit (events.js:95:17) at Socket.<anonymous> (stream_readable.js:748:14) at Socket.emit (events.js:92:17) at emitReadable (_stream_readable.js:410:10) -------------------- at Protocol._enqueue (/root/yanqiang/web/node_modules/mysql/lib/protocol/Protocol.js:135:48) at Connection.query (/root/yanqiang/web/node_modules/mysql/lib/Connection.js:184:25) at Object.<anonymous> (/root/yanqiang/web/test/test.js:33:7) at Module._compile (module.js:456:26) at Object.Module._extensions…js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Function.Module.runMain (module.js:497:10) at startup (node.js:119:16) at node.js:906:3

当然可以。在 Node.js 中使用 node-mysql 库时,你可能会遇到想要执行 MySQL 的 SOURCE 命令来导入 SQL 文件的情况。然而,node-mysql 并不直接支持 SOURCE 命令。SOURCE 是 MySQL 客户端的一个特定功能,用于从文件中读取并执行 SQL 命令。

不过,你可以通过编程方式实现类似的功能。以下是一个示例代码,展示如何在 Node.js 中使用 node-mysql 库来读取 SQL 文件并逐行执行其中的 SQL 语句。

示例代码

首先,确保你已经安装了 mysqlfs 模块(fs 是 Node.js 的内置模块,无需额外安装):

npm install mysql

然后,创建一个 JavaScript 文件(例如 importSql.js),并在其中编写以下代码:

const mysql = require('mysql');
const fs = require('fs');
const path = require('path');

// 创建数据库连接
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'yourusername',
  password: 'yourpassword',
  database: 'yourdatabase'
});

connection.connect((err) => {
  if (err) throw err;
  console.log('Connected to the database.');
  
  // 读取 SQL 文件
  const sqlFilePath = path.join(__dirname, 'yourfile.sql');
  fs.readFile(sqlFilePath, 'utf8', (err, data) => {
    if (err) throw err;

    // 将文件内容按行分割
    const sqlStatements = data.split(/;(?=\s*(?:-- |\/\*))/);

    // 执行每条 SQL 语句
    sqlStatements.forEach((statement) => {
      if (statement.trim() !== '') {
        connection.query(statement, (err, results) => {
          if (err) {
            console.error(`Error executing statement: ${statement}`);
            throw err;
          }
          console.log(`Executed: ${statement}`);
        });
      }
    });

    // 关闭连接
    connection.end();
  });
});

解释

  1. 数据库连接:使用 mysql.createConnection 创建与数据库的连接。
  2. 读取 SQL 文件:使用 fs.readFile 读取 SQL 文件的内容。
  3. 分割 SQL 语句:使用正则表达式将文件内容按分号分割成单独的 SQL 语句。
  4. 执行 SQL 语句:遍历分割后的 SQL 语句数组,并使用 connection.query 执行每个 SQL 语句。
  5. 错误处理:如果执行过程中出现错误,打印错误信息并抛出异常。
  6. 关闭连接:所有 SQL 语句执行完毕后,调用 connection.end() 关闭数据库连接。

这样,你就可以在 Node.js 中模拟 SOURCE 命令的功能,逐行读取并执行 SQL 文件中的内容。

node-mysql 是一个用于 Node.js 的 MySQL 客户端库,但它并不直接支持 source 命令,因为 source 是 MySQL 命令行工具中的一个功能,用于执行存储在文件中的 SQL 脚本。要在 Node.js 中使用类似的逻辑来执行存储在文件中的 SQL 脚本,你可以手动读取文件并逐行解析 SQL 语句。

以下是一个简单的示例,演示如何实现这一点:

  1. 首先安装 mysql 库(如果你还没有安装的话):

    npm install mysql
    
  2. 然后你可以使用以下代码来执行 SQL 脚本文件:

const fs = require('fs');
const mysql = require('mysql');

// 创建数据库连接
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'yourusername',
  password: 'yourpassword',
  database: 'yourdatabase'
});

connection.connect((err) => {
  if (err) throw err;
  console.log('Connected to the database!');
  
  // 读取SQL脚本文件
  const sqlFilePath = './path/to/your/schema.sql';
  fs.readFile(sqlFilePath, 'utf8', (err, data) => {
    if (err) throw err;

    // 将文件内容按分号分割成多个SQL语句
    const sqlStatements = data.split(';');

    // 执行每个SQL语句
    for (let statement of sqlStatements) {
      statement = statement.trim(); // 移除多余的空白字符
      if (statement) {
        connection.query(statement, (err, results) => {
          if (err) {
            console.error(`Error executing query: ${statement}`);
            console.error(err);
            return;
          }
          console.log(`Executed: ${statement}`);
        });
      }
    }
  });
});

解释

  • fs.readFile:用于读取包含 SQL 语句的文件。
  • split(’;’):将读取到的字符串按分号分割,从而分离出单个的 SQL 语句。
  • trim():移除每条 SQL 语句前后的空格和换行符。
  • connection.query:用于执行 SQL 语句。

请注意,这只是一个简单的实现。在生产环境中,你需要处理错误、事务管理和更复杂的 SQL 语法。

回到顶部