16

我正在尝试将 Strongloop 与 MySql 一起使用,但无法弄清楚如何将表迁移或自动创建到 MySql 数据库中。

至少有一种方法可以将模型导出到 MySql 模式中,还是我必须手动创建表?

我一直在尝试使用 mysql 演示应用程序,并且浏览了一段时间的文档,但没有运气 - http://docs.strongloop.com/display/DOC/MySQL+connector

谢谢!

4

8 回答 8

36

我创建了/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();

};
于 2015-06-29T15:27:22.187 回答
12

您可以通过在app.start方法之前向server.js文件中添加以下行来简单地迁移模型:

app.datasources['mySqlConnection'].automigrate(['orders','customers', 'User', 'ACL'], function(err) {
     console.log(err);
});
  1. 根据需要将模型添加到阵列中。
  2. 运行应用程序slc run

注意:mySqlConnection是连接名,替换成自己的连接名。

于 2014-12-05T10:28:06.693 回答
10

为您的模型更新和/或创建所有 mysql 表:

var dataSource = app.dataSources.mysql;       
dataSource.autoupdate(null, function (err) {
    if(err) return cb(err);
    return cb();
});      
于 2016-09-29T19:22:39.017 回答
8

LoopBack 将其称为自动迁移。检查这些链接并搜索该术语:

LoopBack 模型的秘诀,第 5 部分(共 5 部分):与关系数据库的模型同步

数据源和连接器

于 2014-04-19T14:43:18.983 回答
1

就我而言,我手动创建了 MySQL 表,然后创建了模型。对于现有的 MySQL 表,我创建了属性名称与 MySQL 字段名称相同的模型。

下面是我在 MySQL 数据库中使用 StrongLoop LoopBack 的步骤:

  1. 创建 MySQL 数据库和表(或使用现有数据库)。
  2. 使用安装 MySQL 连接器npm install loopback-connector-mysql --save
  3. datasources.json在文件中添加您的 MySQL 数据库详细信息。
  4. slc lb model tablename -i使用OR 编辑文件为每个表创建一个模型models.json并手动添加属性。(文档:http ://docs.strongloop.com/display/DOC/Creating+a+LoopBack+application#CreatingaLoopBackapplication-Creatingmodels )
  5. 属性名称应与 MySQL 字段名称相同(有关将 MySQL 映射到 JSON 数据类型的更多信息:http: //docs.strongloop.com/display/DOC/MySQL+connector#MySQLconnector-MySQLtoJSONtypes
于 2014-04-19T14:37:06.323 回答
0

在同类问题中,如果需要自动创建数据库,可以使用createDatabasedataSource JSON 文件中的选项。

  "mysql": {
    "host": "localhost",
    "port": 0,
    "database": "db",
    "username": "root",
    "password": "",
    "name": "mysql",
    "connector": "mysql",
    "debug": false,
    "createDatabase": true
  }

因此,您无需自己编写查询来创建基础。希望能帮助到你。

于 2015-02-05T14:54:17.493 回答
0

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');
};
于 2016-09-05T18:31:31.910 回答
-1

我发现了一种简单的方法来完成这项任务。参考链接是: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。

于 2016-04-05T03:07:38.623 回答