回答

收藏

在Node环境中导入SQL转储

技术问答 技术问答 201 人阅读 | 0 人回复 | 2023-09-13

我想要一个npm脚本来创建/配置/等。最后导入一个SQL转储。整个创建,配置等都可以正常工作,但是,我无法使导入正常工作。永远不会插入数据。这就是我所拥有的(不要嵌套嵌套的回调,因为它们会变成promise):' u& o  F2 t; ^; k8 n, P3 b
connection.query(`DROP DATABASE IF EXISTS ${config.database};`, err => {
8 n8 f' Z5 F/ f, e' @  connection.query(`CREATE DATABASE IF NOT EXISTS ${config.database};`, err => {) F9 H2 m% D( S+ X# v# B
    connection.query('use DATABASENAME', err => {
0 R4 h+ Q0 ?* H& B. p& K& f  [# z      const sqlDumpPath = path.join(__dirname, 'sql-dump/sql-dump.sql');
; t8 m. ~/ y0 K: V  {) ?      connection.query(`SOURCE ${sqlDumpPath}`, err => {
* l' f: `" ^5 c& }1 w* d% s        connection.end(err => resolve());
. t( ^# S# L* t: \3 p3 T      });& b5 e% A4 t& w8 M: J% [5 a" c% _
    })0 n8 G  F1 }/ l- P  m
  });
5 ~/ h* ~* W2 a+ J});0 G' `; q, K/ I. [/ b6 a
我还尝试了Sequelize(ORM)进行以下操作:
; }; {6 S$ w& ~3 {, Vreturn new Promise(resolve => {4 p' b; o# C! z+ g5 s" b- [" C
  const sqlDumpPath = path.join(__dirname, 'sql-dump/sql-dump.sql');
0 h. `2 q* \6 B0 m- x. H7 I9 C- v  fs.readFile('./sql/dump.sql', 'utf-8', (err, data) => {
8 Z& d4 @9 I# k+ I! V3 |    sequelize
2 H* l2 R2 x3 G! w$ s/ `1 W$ l      .query(data)7 m: z- ]& K* n- s) y) y" X
      .then(resolve)
$ {' E9 T& B7 @9 W      .catch(console.error);: t) b; V/ I& Z+ l4 K
  });
" ~5 z3 h$ {% q' N( P});; E* ^" E/ ?1 W9 j0 M0 Z( s
                ) N5 {7 ~$ y* n( ^7 x
解决方案:9 L: h& n. p/ a- S
                " `: ~3 X  M' O1 w  J
0 `" n' m& S! h# K2 ~! r5 N9 J
, A5 Y( ~/ q7 D& V2 p+ m. E
                这是我使用迁移框架设置初始Sequelized导入的方法。这里有很多事情要做,但总之我:/ ]& \' d: t) S& W  U% O
[ol]在migrations文件夹中找到最新的sql-dump8 i4 p1 [7 @" u5 Q/ v+ v
使用读取文件 fs" W' ^' e) W- {
将文本分为查询" ^, B1 T$ B" `. ]
检查其是否为有效查询,如果是,则应用我需要的数据进行一些清理(请参阅相关文章)$ ?5 u5 `& K6 M) [" z  b+ B
推送一个充满查询的数组-我首先通过调用第this.down一个来确保数据库是干净的3 T2 R: b3 V4 g( Y4 A
运行一切当成了承诺(如建议在这里使用)mapSeries( 未 在map)9 Y8 J: C/ k" `4 [
[/ol]5 K1 @* n" E+ P4 H; h/ i* `" q
sequelize-cli您可以在shell中使用以下代码来创建迁移:8 N! F, ?6 D* r; a
sequelize migration:create6 a8 m# P3 U( ^( e( w/ W% B
然后,您将自动在下面的代码输入文件中找到该文件。为了执行迁移,您只需编写:; i8 p2 k0 C1 j* P; M
sequelize db:migrate& Y. z% q9 C2 m$ \* h: y& x4 T/ i
! d& D" c* H6 w- K" V* D1 E
"use strict";
+ i' J( |4 e( \/ a  E1 j# k- @, L: @const promise = require("bluebird");" s2 ]8 }+ r0 S2 L* p7 U
const fs = require("fs");
$ ^- j! c' ~( `0 Vconst path = require("path");: y; z; ]5 V: X1 P" Z* V2 d; K! ~* p
const assert = require("assert");7 z3 e' }; g, V8 Z
const db = require("../api/models"); // To be able to run raw queries6 \; S+ C) r0 g- F% U
const debug = require("debug")("my_new_api");3 f( i4 q1 N& x5 q$ n! l7 u, N
// I needed this in order to get some encoding issues straight9 K% |; o( M+ V  c9 a; ?
const Aring = new RegExp(String.fromCharCode(65533) +
4 }+ U. w! D/ |; b! a) r  "\\" + String.fromCharCode(46) + "{1,3}", "g");7 M. ^7 e9 _' Q: L
const Auml = new RegExp(String.fromCharCode(65533) +2 ]  t) R; ~! p& s5 ^$ M
  String.fromCharCode(44) + "{1,3}", "g");
* o/ A9 @+ w) c. gconst Ouml = new RegExp(String.fromCharCode(65533) +% P* X/ p* ^3 e& u8 r
  String.fromCharCode(45) + "{1,3}", "g");. P) N' P0 x- g" ^9 }2 C; Q
module.exports = {
' g# t' |# X4 a! l( O0 ~  up: function (queryInterface, Sequelize) {
( v: e+ N; ]. p' z' |; g( n9 {+ D! o    // The following section allows me to have multiple sql-files and only use the last dump
4 B* C1 r! n* C* H( R    var last_sql;
* A% z6 ^# V4 w. a  o, }& t8 J. |    for (let fn of fs.readdirSync(__dirname)){
7 t2 p3 E. g0 e      if (fn.match(/\.sql$/)){
0 z, A* ~4 w% H3 H0 p$ c" \' F        fn = path.join(__dirname, fn);
$ i% E9 |) E5 e/ p: D+ j2 `7 A        var stats = fs.statSync(fn);
+ ^* s- H) d9 x" I1 d        if (typeof last_sql === "undefined" ||& i9 A5 m2 M6 b8 I9 h2 M
            last_sql.stats.mtime  db.sequelize.query(clean_query)# a% j2 K, N- `! z
      });4 n+ a3 u4 d. M2 N; |8 t
    }) E+ [5 o' X; m6 `& _& L
    // The Series is important as the order isn't retained with just map
# N2 t; m) f7 F$ _    return promise.mapSeries(actions, function(item) {
5 z0 E) C) `* z1 a, {      debug(item.query);
- ?$ Q8 W9 ~- Z1 y. P      return item.exec();$ K0 }3 }6 |% `; G) T" z
    }, { concurrency: 1 });" w3 r) W+ e+ F* i, r
  },
% U1 g% p1 _. M' j+ d2 D  Y" ~, Z  down: function (queryInterface, Sequelize) {# }# ?: q0 j9 e" }
    var tables_2_drop = [
8 I# p) R  Y# Z) X3 E      "items"," [! y6 r) w1 j
      "users",9 I+ f9 n0 G; \( \* |
      "usertypes", i  e4 j0 m1 h5 j& S! q5 B2 }
    ];! K, \1 e' w9 s# x; w
    var actions = [];
8 Y2 P3 V0 q3 Z& V    for (let tbl of tables_2_drop){
0 a4 |$ x; |4 ]      actions.push({
% M# ^' k, H/ n% a1 Y" X7 [        // The created should be created_at2 X& }- v2 \( A" m' {
        exec: () => db.sequelize.query("DROP TABLE IF EXISTS `" + tbl +"`")  _3 V8 t$ C* m5 {
      });" W! K+ J# \9 C( f3 A6 t% r" G
    }$ t' `$ x/ d9 }/ \( z
    return promise.map(actions, function(item) {# U9 A7 F2 f: }/ Q, ^# ^/ k! a9 O
      return item.exec();
2 l0 L1 x  y9 P, y, l7 O: w% J    }, { concurrency: 1 });/**/1 s  \0 d4 M: `: y- D( e
  }
: K# ^$ c# Q5 z};
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则