Knex-MySQL如何在一个JavaScript字符串中执行多个语句?

问题描述

我正在尝试使用knex在迁移文件中执行一些sql指令。 为了获得更大的灵活性,我想将所有相关的sql放在一个字符串中。 问题是:当我在字符串中有两个或多个语句时,MysqL无法执行 了解它并引发以下错误: “ You have an error in your sql Syntax; check the manual that corresponds to your MariaDB server..."

我相信,这是由于我原始结果中的\ n,\ s和\ t字符引起的。 我已经尝试过.replace(/\n/g,'').replace(/\t/g,''),但是对它没有任何影响。

在这种情况下,有什么方法可以执行包含多个语句的RAW字符串?

非常感谢。

我的原始方法

// Fail
    exports.up = async (knex) => {
      try {
        console.info('Migrating CLIENT...');
        return await knex.raw(
          `
          DELETE FROM monthly_consumption;
          DELETE FROM project;
          DELETE FROM project_client;
          DELETE FROM client;
          ALTER TABLE client DROP PRIMARY KEY;
          ALTER TABLE client ADD id BIGINT auto_increment;
          ALTER TABLE client ADD CONSTRAINT client_pk PRIMARY KEY (id);
        `
            .replace(/\n/g,'')
            .replace(/\t/g,' ')
        );
      } catch (err) {
        console.error('******** ERROR ********\n',err);
        throw new Error(err);
      }
    };

另一方面,如果我运行以下命令,它将起作用,也就是说,如果仅包含一条语句,它将可以正常工作。

// Success
exports.up = async (knex) => {
  try {
    console.info('Migrating CLIENT...');
    return await knex.raw(
      `
      DELETE FROM monthly_consumption;
    `
        .replace(/\n/g,'')
        .replace(/\t/g,' ')
    );
  } catch (err) {
    console.error('******** ERROR ********\n',err);
    throw new Error(err);
  }
};

我也尝试将所有内容放在一行中,但再次失败:

// Fail
exports.up = async (knex) => {
  try {
    console.info('Migrating CLIENT...');
    return await knex.raw(
      `
      DELETE FROM monthly_consumption; DELETE FROM project;
    `
        .replace(/\n/g,err);
    throw new Error(err);
  }
};

最后一个示例的原始sql输出

migration Failed with error: Error:       DELETE FROM monthly_consumption; DELETE FROM project;     - ER_PARSE_ERROR: You have an error in your sql Syntax; check the manual that corresponds to your MariaDB server version for the right Syntax to use near 'DELETE FROM project' at line 1

解决方法

我找到了解决方案。它与MySQL本身有关。我们需要启用多语句功能。在knexfile.js里面,我只是插入:

 multipleStatements: true

最后,它运行良好。