使用StrongLoop自动创建mysql表

时间:2014-04-19 10:40:11

标签: mysql node.js schema strongloop loopbackjs

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

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

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

谢谢!

8 个答案:

答案 0 :(得分:34)

我创建了/server/boot/autoupdate.js。它在应用程序启动时运行。它加载" model-config"和"数据源" 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();

};

答案 1 :(得分:12)

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

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

    注意:mySqlConnection是连接名称,请用您自己的连接名称替换它。

答案 2 :(得分:8)

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

var dataSource = app.dataSources.mysql;       
dataSource.autoupdate(null, function (err) {
    if(err) return cb(err);
    return cb();
});      

答案 3 :(得分:7)

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

Recipes for LoopBack Models, part 5 of 5: Model Synchronization with Relational Databases

<德尔> Data sources and connectors

答案 4 :(得分:1)

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

以下是我使用StrongLoop LoopBack和MySQL数据库的步骤:

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

答案 5 :(得分:0)

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

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

因此,您无需自己编写查询来创建基础。 希望它有所帮助。

答案 6 :(得分:0)

我发现了一种简单的方法来完成这项任务。参考链接为: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):如果您不想放置模型,将更新其基本属性等于&#34; PersistedModel&#34;的文件的所有模型。

有了这个,我就像这样使用:


    autoupdate function () {
        ds.autoupdate (function (error) {
          if (!error) {
                console.log( "Updated all models");
          }else {
                console.log( "An error has occurred:" + error);
          }
          ds.disconnect();
        });
    }
    

我打电话给: autoupdate();

您可以将此代码放在file.js中并调用命令行:node file.js。

如果您希望每次启动程序时都调用此文件,请将其放在 /server/boot/file.js 路径上。

显然,如果你想使用automigrate,只能通过自动迁移替换上面代码中的autoupdate字。

答案 7 :(得分: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');
};