当前位置: 首页 > 面试题库 >

在Node环境中导入SQL转储

史涵育
2023-03-14
问题内容

我想要一个npm脚本来创建/配置/等。最后导入一个SQL转储。整个创建,配置等都可以正常工作,但是,我无法使导入正常工作。永远不会插入数据。这就是我所拥有的(不要嵌套嵌套的回调,因为它们会变成promise):

connection.query(`DROP DATABASE IF EXISTS ${config.database};`, err => {
  connection.query(`CREATE DATABASE IF NOT EXISTS ${config.database};`, err => {
    connection.query('use DATABASENAME', err => {
      const sqlDumpPath = path.join(__dirname, 'sql-dump/sql-dump.sql');
      connection.query(`SOURCE ${sqlDumpPath}`, err => {
        connection.end(err => resolve());
      });
    })
  });
});

我还尝试了Sequelize(ORM)进行以下操作:

return new Promise(resolve => {
  const sqlDumpPath = path.join(__dirname, 'sql-dump/sql-dump.sql');
  fs.readFile('./sql/dump.sql', 'utf-8', (err, data) => {
    sequelize
      .query(data)
      .then(resolve)
      .catch(console.error);
  });
});

问题答案:

这是我使用迁移框架设置初始Sequelized导入的方法。这里有很多事情要做,但总之我:

  1. 在migrations文件夹中找到最新的sql-dump
  2. 使用读取文件 fs
  3. 将文本分为查询
  4. 检查其是否为有效查询,如果是,则应用我需要的数据进行一些清理(请参阅相关文章)
  5. 推送一个充满查询的数组-我首先通过调用第this.down一个来确保数据库是干净的
  6. 运行一切当成了承诺(如建议在这里使用)mapSeriesmap

sequelize-cli您可以在shell中使用以下代码来创建迁移:

sequelize migration:create

然后,您将自动在下面的代码输入文件中找到该文件。为了执行迁移,您只需编写:

sequelize db:migrate



"use strict";
const promise = require("bluebird");
const fs = require("fs");
const path = require("path");
const assert = require("assert");
const db = require("../api/models"); // To be able to run raw queries
const debug = require("debug")("my_new_api");

// I needed this in order to get some encoding issues straight
const Aring = new RegExp(String.fromCharCode(65533) +
  "\\" + String.fromCharCode(46) + "{1,3}", "g");
const Auml = new RegExp(String.fromCharCode(65533) +
  String.fromCharCode(44) + "{1,3}", "g");
const Ouml = new RegExp(String.fromCharCode(65533) +
  String.fromCharCode(45) + "{1,3}", "g");

module.exports = {
  up: function (queryInterface, Sequelize) {
    // The following section allows me to have multiple sql-files and only use the last dump
    var last_sql;
    for (let fn of fs.readdirSync(__dirname)){
      if (fn.match(/\.sql$/)){
        fn = path.join(__dirname, fn);
        var stats = fs.statSync(fn);
        if (typeof last_sql === "undefined" ||
            last_sql.stats.mtime < stats.mtime){
          last_sql = {
            filename: fn,
            stats: stats
          };
        }
      }
    }
    assert(typeof last_sql !== "undefined", "Could not find any valid sql files in " + __dirname);

    // Split file into queries
    var queries = fs.readFileSync(last_sql.filename).toString().split(/;\n/);

    var actions = [{
      query: "Running the down section",
      exec: this.down
    }]; // Clean database by calling the down first

    for (let i in queries){
      // Skip empty queries and the character set information in the 40101 section
      //   as this would most likely require a multi-query set-up
      if (queries[i].trim().length == 0 ||
          queries[i].match(new RegExp("/\\*!40101 .+ \\*/"))){
        continue;
      }

      // The manual fixing of encoding
      let clean_query = queries[i]
        .replace(Aring, "脜")
        .replace(Ouml, "脰")
        .replace(Auml, "脛");

      actions.push({
        query: clean_query.substring(0, 200), // We save a short section of the query only for debugging purposes
        exec: () => db.sequelize.query(clean_query)
      });
    }

    // The Series is important as the order isn't retained with just map
    return promise.mapSeries(actions, function(item) {
      debug(item.query);

      return item.exec();
    }, { concurrency: 1 });
  },

  down: function (queryInterface, Sequelize) {
    var tables_2_drop = [
      "items",
      "users",
      "usertypes"
    ];
    var actions = [];
    for (let tbl of tables_2_drop){
      actions.push({
        // The created should be created_at
        exec: () => db.sequelize.query("DROP TABLE IF EXISTS `" + tbl +"`")
      });
    }

    return promise.map(actions, function(item) {
      return item.exec();
    }, { concurrency: 1 });/**/
  }
};


 类似资料:
  • node环境怎么能完成上面这种操作。。。我希望代码在node和浏览器都能执行。 用了top await所以node设置了type : module,

  • 我正在创建一个环境模块来补充缺失的打字。我可以创建打字。d、 ts这为环境模块提供了正确的类型。 由于某种原因,当我这样做时,环境模块的import语句中断。 typings.d.ts 在上面的例子中,我想从另一个库中提供适当的返回类型。

  • 我的TypeScript项目中有一个声明文件,如下所示: 这很好用,我可以在项目中的任何地方使用这个名称空间,而无需导入它。 我现在需要从第三方模块导入一个类型并在我的环境声明中使用它: 编译器现在抱怨它找不到名称空间“MyApp”,可能是因为导入阻止了它处于环境中。 是否有一些简单的方法可以在使用第三方类型的同时保留声明的环境性?

  • 使用文本编辑器来开发Node程序,最大的缺点是效率太低,运行Node程序还需要在命令行单独敲命令。如果还需要调试程序,就更加麻烦了。 所以我们需要一个IDE集成开发环境,让我们能在一个环境里编码、运行、调试,这样就可以大大提升开发效率。 Java的集成开发环境有Eclipse,Intellij idea等,C#的集成开发环境有Visual Studio,那么问题又来了:Node.js的集成开发环境

  • 我想做一个功能,定期通知用户,尤其是ios移动设备。 具体来说,我使用Pythonywhere的“预定任务”。(https://help.pythonanywhere.com/pages/ScheduledTasks) 这是我发送通知的脚本。 但在从push_notifications.models导入APNSDevice, GCMDevice行,我得到一个错误: 'ImportError:没有名

  • 本文向大家介绍axios为什么能在浏览器中环境运行又能在node中环境运行?相关面试题,主要包含被问及axios为什么能在浏览器中环境运行又能在node中环境运行?时的应答技巧和注意事项,需要的朋友参考一下 源码中defaults.js文件里有getDefaultAdapter这个方法,用来判断环境。如果是浏览器就实例new XMLHttpRequest()来发送请求响应服务,node环境就引用h