2017-08-29 106 views
0

你好我正尝试SQLite数据库转换为NeDb,使用此代码:异步函数循环

const sqliteJSON = require('sqlite-json'); 
const Datastore = require('nedb') 

const exporter = sqliteJSON('etecsa.db'); 

db = new Datastore('etecsa.nedb'); 
db.loadDatabase(); 

tables = ['fix','movil']; 

tables.forEach(function(table) { 
    sql = 'select count(1) from ' + table; 

    exporter.json(sql, function (err, json) { 
     toNeDB(table, JSON.parse(json)[0]['count(1)']) 
    }); 

}, this); 

var toNeDB = function(table, count) { 
    var inc = 10000; 
    console.log(table + ' => ' + count) 

    for (var i = 0; i < count + inc; i += inc) { 
     var sql = 'SELECT * FROM ' + table + ' ORDER BY province ASC, number DESC LIMIT '+ i + ' , ' + inc; 
     console.log(i) 
     exporter.json(sql, function(err, json) { 
      var data = JSON.parse(json); 
      db.insert(data, function (err, newDoc) {}); 
     }); 
    } 
} 

的问题是,for循环它不工作,我的愿望。我需要使用它来更改sql分页,因为sqlite数据库非常庞大,我无法通过单个查询传递所有数据。

UPDATE使用async.map

const sqliteJSON = require('sqlite-json'); 
const Datastore = require('nedb') 
var range = require("range"); 
var async = require("async"); 

const exporter = sqliteJSON('etecsa.db'); 

db = new Datastore('etecsa.nedb'); 
db.loadDatabase(); 

tables = ['fix','movil']; 

tables.forEach(function(table) { 
    sql = 'select count(1) from ' + table; 

    exporter.json(sql, function (err, json) { 
     toNeDB(table, JSON.parse(json)[0]['count(1)']) 
    }); 

}, this); 


var toNeDB = function(table, count, cb) { 
    var inc = 10000; 
    var pagination = range.range(1,count+inc,inc) 

    async.map(pagination, function (page, cb){ 
     var sql = 'SELECT * FROM ' + table + ' ORDER BY province ASC, number DESC LIMIT '+ page + ' , ' + inc; 
     console.log(page, table, inc); 
     exporter.json(sql, function(err, json) { 
      var data = JSON.parse(json); 
      console.log(data[0]) 
      db.insert(data, function (err, newDoc) {}); 
     }); 
    }.bind({ table: table, inc: inc }), function(err,results){ 

    }) 

} 

和输出:

1 'fix' 10000 
10001 'fix' 10000 
.... 
1150001 'fix' 10000 

1 'movil' 10000 
10001 'movil' 10000 
... 
3730001 'movil' 10000 


{ number: '8775031', 
    name: 'UNION ELECTRICA', 
    address: 'S ALLENDE #666 OQUENDO SOLEDAD', 
    province: 7 } 
{ number: '8734454', 
    name: 'EMP ESTB ESP Y SERVICIOS', 
    address: 'ESAPDA #256 CONCORDIA S LAZARO', 
    province: 7 } 
+0

您可能要结帐[异步映射(https://caolan.github.io/async/docs.html#map)。 – Will

+0

@ will,但要使用地图,我需要有一个分页列表迭代,所以我不知道它是一个很好的解决方案 – efirvida

+0

是什么问题?我没有设法理解它。 – felixmosh

回答

1

如果你需要知道什么时候每个动作发生,你应该把console.log回调里面。

类似的东西:

var toNeDB = function(table, count) { 
var inc = 10000; 
    console.log(table + ' => ' + count) 

    for (var i = 0; i < count + inc; i += inc) { 
     var sql = 'SELECT * FROM ' + table + ' ORDER BY province ASC, number DESC LIMIT '+ i + ' , ' + inc; 

     exporter.json(sql, (function(i) { 
      return function(err, json) { 
       console.log(i) 
       var data = JSON.parse(json); 
       db.insert(data, function (err, newDoc) {}); 
      } 
     })(i)); 
    } 
} 
+0

它不工作,因为我需要 – efirvida

1

你可以使用,而不是一个循环递归,这样你就可以肯定下一次迭代将不会执行,直到第一个完成。

var proc = function (i, count, table) { 
    var sql = 'SELECT * FROM ' + table + ' ORDER BY province ASC, number DESC 
      LIMIT ' + i + ' , ' + inc' 
    console.log(i) 
    exporter.json(sql, function (err, json) { 
    var data = JSON.parse(json) 
    db.insert(data, function (err, newDoc) { 
     if (i < count) { 
     i += inc 
     proc(i, count, table) 
     } 
    }) 
    }) 
} 
var toNeDB = function (table, count) { 
    var inc = 10000 
    console.log(table + ' => ' + count) 
    proc(0, count, table) 
} 

让我知道是否可行