2015-05-13 37 views
0

我正在使用LoopBack自动迁移来在应用程序启动期间从模型创建MySQL数据库表。我的帐户模型定义了与我的信用模型的hasAndBelongsToMany关系,反之亦然。LoopBack Automigrate调用顺序

我想在帐户中创建一个贷项,但是我得到一个SQL错误。 “错误:ER_PARSE_ERROR:你的SQL语法错误;检查对应于你的MySQL服务器版本的手册,在第1行'3 ORDER BY id LIMIT 1'附近使用正确的语法”

根据我日志记录,似乎automigrate不会按照我的automigrate.js文件中定义的顺序发生,并且某些任意顺序由LoopBack分配,这会导致在尝试向其添加信用时不会创建帐户表...

根据我的日志记录,环回创建automigrate表的顺序,它首先创建帐户,然后creditaccounts,然后信贷...我需要它是帐户,信用,然后creditaccounts。

我的问题是如何控制LoopBack在使用自动迁移时创建数据库表的顺序?或者我错过了什么?

我的服务器的/ boot/automigrate.js文件的压缩版:

app.automigrate('account', function(err) { 
    server.models.Account.create({id:1}, function(err, record) { 
    //handle errors here 
    }); 
}); 

app.automigrate('credit', function(err) { 
    server.models.Credit.create({id:1}, function(err, record) { 
    //handle errors here 
    }); 
}); 

app.automigrate('creditaccount', function(err) { 
    server.models.Account.findById({id:1}, function(err, account) { 
    server.models.Credit.findById({id:1}, function(err, credit) { 
     account.credits.add(credit, function(err, creditaccount) { 
     //error handling 
     }) 
    });   
    }); 
}); 
+0

“似乎automigrate并不在我的automigrate.js文件中定义的顺序发生” ......尽管你解决了你的语法错误,并不能保证你的代码将以wri的顺序执行tten。这是可能的,但不一定是那样。 Loopback没有任何内部的任意执行顺序。您应该阅读更多关于nodejs,了解事件循环,非阻塞代码和回调的内容。如果您需要特定的执行顺序,则必须以不同的方式编写代码。 –

+0

谢谢A.Z.我理解LoopBack和回调的异步性质,但找不到使用相关模型进行自动化的任何示例,并且文档很薄。您如何执行此操作? – Mozfet

+0

也许这个答案可以帮助你更多的迁移http://stackoverflow.com/questions/29974947/migrating-built-in-models-to-databases/30038210#30038210 –

回答

1

该解决方案具有无关automigrate,SQL错误是因为我试图调用Account.findById与对象第一个参数,而不是为ID的基本参数,...因此它应该是:

app.automigrate('account', function(err) { 
    server.models.Account.create({id:1}, function(err, record) { 
    //handle errors here 
    }); 
}); 

app.automigrate('credit', function(err) { 
    server.models.Credit.create({id:1}, function(err, record) { 
    //handle errors here 
    }); 
}); 

app.automigrate('creditaccount', function(err) { 
    server.models.Account.findById(1, function(err, account) { 
    server.models.Credit.findById(1, function(err, credit) { 
     account.credits.add(credit, function(err, creditaccount) { 
     //error handling 
     }) 
    });   
    }); 
});