我正在尝试将 Strongloop 与 MySql 一起使用,但无法弄清楚如何将表迁移或自动创建到 MySql 数据库中。
至少有一种方法可以将模型导出到 MySql 模式中,还是我必须手动创建表?
我一直在尝试使用 mysql 演示应用程序,并且浏览了一段时间的文档,但没有运气 - http://docs.strongloop.com/display/DOC/MySQL+connector
谢谢!
我正在尝试将 Strongloop 与 MySql 一起使用,但无法弄清楚如何将表迁移或自动创建到 MySql 数据库中。
至少有一种方法可以将模型导出到 MySql 模式中,还是我必须手动创建表?
我一直在尝试使用 mysql 演示应用程序,并且浏览了一段时间的文档,但没有运气 - http://docs.strongloop.com/display/DOC/MySQL+connector
谢谢!
我创建了/server/boot/autoupdate.js
. 它在应用程序启动时运行。它加载“模型配置”和“数据源”JSON,并将所有模型迁移或更新到为它们定义的数据源。
# /server/boot/autoupdate.js
module.exports = function(app) {
var path = require('path');
var models = require(path.resolve(__dirname, '../model-config.json'));
var datasources = require(path.resolve(__dirname, '../datasources.json'));
function autoUpdateAll(){
Object.keys(models).forEach(function(key) {
if (typeof models[key].dataSource != 'undefined') {
if (typeof datasources[models[key].dataSource] != 'undefined') {
app.dataSources[models[key].dataSource].autoupdate(key, function (err) {
if (err) throw err;
console.log('Model ' + key + ' updated');
});
}
}
});
}
function autoMigrateAll(){
Object.keys(models).forEach(function(key) {
if (typeof models[key].dataSource != 'undefined') {
if (typeof datasources[models[key].dataSource] != 'undefined') {
app.dataSources[models[key].dataSource].automigrate(key, function (err) {
if (err) throw err;
console.log('Model ' + key + ' migrated');
});
}
}
});
}
//TODO: change to autoUpdateAll when ready for CI deployment to production
autoMigrateAll();
//autoUpdateAll();
};
您可以通过在app.start方法之前向server.js文件中添加以下行来简单地迁移模型:
app.datasources['mySqlConnection'].automigrate(['orders','customers', 'User', 'ACL'], function(err) {
console.log(err);
});
slc run
。注意:
mySqlConnection
是连接名,替换成自己的连接名。
为您的模型更新和/或创建所有 mysql 表:
var dataSource = app.dataSources.mysql;
dataSource.autoupdate(null, function (err) {
if(err) return cb(err);
return cb();
});
就我而言,我手动创建了 MySQL 表,然后创建了模型。对于现有的 MySQL 表,我创建了属性名称与 MySQL 字段名称相同的模型。
下面是我在 MySQL 数据库中使用 StrongLoop LoopBack 的步骤:
npm install loopback-connector-mysql --save
datasources.json
在文件中添加您的 MySQL 数据库详细信息。slc lb model tablename -i
使用OR 编辑文件为每个表创建一个模型models.json
并手动添加属性。(文档:http ://docs.strongloop.com/display/DOC/Creating+a+LoopBack+application#CreatingaLoopBackapplication-Creatingmodels )在同类问题中,如果需要自动创建数据库,可以使用createDatabase
dataSource JSON 文件中的选项。
"mysql": {
"host": "localhost",
"port": 0,
"database": "db",
"username": "root",
"password": "",
"name": "mysql",
"connector": "mysql",
"debug": false,
"createDatabase": true
}
因此,您无需自己编写查询来创建基础。希望能帮助到你。
jduhls 的答案很漂亮,但我需要稍微调整一下以将一些静态数据添加到表中。这是我的调整版本,以及将数据加载到简单 SystemSettings 表(id、settingName、settingValue)中的示例:
var async = require('async');
var SYSTEM_SETTINGS = [
{
"settingName": "mustPayInAdvance",
"settingValue": "false",
}
];
module.exports = function(app) {
var path = require('path');
var models = require(path.resolve(__dirname, '../model-config.json'));
var datasources = require(path.resolve(__dirname, '../datasources.json'));
var modelUpdates = [];
function buildModelListForOperation(){
Object.keys(models).forEach(function(key) {
if (typeof models[key].dataSource != 'undefined') {
if (typeof datasources[models[key].dataSource] != 'undefined') {
modelUpdates.push({operation: app.dataSources[models[key].dataSource], key: key});
}
}
});
}
function createStaticData() {
app.models.SystemSettings.create(SYSTEM_SETTINGS, function(err, created) {
if (err)
throw err;
else
console.log('Sample data was imported.');
});
}
function processModelsAndData(operationType) {
buildModelListForOperation();
// Create all models
async.each(modelUpdates, function(item, callback) {
item.operation[operationType](item.key, function (err) {
if (err) throw err;
console.log('Model ' + item.key + ' migrated');
callback();
});
}, function (err) {
if (err) throw err;
createStaticData();
});
}
//TODO: change to 'autoupdate' when ready for CI deployment to production
processModelsAndData('automigrate');
};
我发现了一种简单的方法来完成这项任务。参考链接是:Clique Here
您可以使用原型,也可以不使用,就我而言,我不使用。
对于文档,您应该使用:
ds.autoupdate (models, function (error) {
if (!error) {
console.log( "Updated models.");
}else{
console.log( "An error has occurred:" + error);
}
ds.disconnect();
});
在哪里:
var path = require ( 'path');
var app = require (path.resolve (__ dirname, '../server/server'));
var ds = app.datasources.x;
x是数据源属性名称,例如 /server/datasources.json :
{
"x": {
"Host": "localhost"
"Port": 3306,
"Database", "loopapp"
"Password": "",
"Name": "x"
"User", "root"
"Connector": "mysql"
}
}
注(1):模型可以是字符串模型名称或字符串数组(模型名称)。
注意(2):如果您不想放置模型,则该文件的所有基本属性等于“PersistedModel”的模型都将被更新。
有了这个,我这样使用:
自动更新函数 () { ds.autoupdate(功能(错误){ 如果(!错误){ console.log("更新了所有模型"); }别的 { console.log("发生错误:" + error); } ds.disconnect(); }); }
我调用了:autoupdate();
您可以将此代码放在 file.js 中并调用命令行:node file.js。
如果您希望每次启动程序时都调用此文件,请将其放在/server/boot/file.js路径中。
显然,如果要使用 automigrate,只需将上面代码中的 autoupdate 一词替换为 automigrate。