【问题标题】:Auto-create mysql table with StrongLoop使用 StrongLoop 自动创建 mysql 表
【发布时间】:2014-06-03 20:08:14
【问题描述】:

我正在尝试将 Strongloop 与 MySql 一起使用,但不知道如何将表迁移或自动创建到 MySql 数据库中。

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

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

谢谢!

【问题讨论】:

  • This 是最干净的答案。一旦您更改模型的数据源配置,所有其他的都需要修改,这很容易出错。

标签: mysql node.js schema strongloop loopbackjs


【解决方案1】:

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

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

  1. 创建 MySQL 数据库和表(或使用现有数据库)。
  2. 使用 npm install loopback-connector-mysql --save 安装 MySQL 连接器
  3. datasources.json 文件中添加您的 MySQL 数据库详细信息。
  4. 使用 slc lb model tablename -i 为每个表创建一个模型,或者编辑 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

【讨论】:

    【解决方案2】:

    【讨论】:

    • thnks,虽然我想我应该指定我一遍又一遍地阅读这些文档,但无法弄清楚。在使用 datasources.json 定义我的数据库连接器时,我对在何处以及如何使用 JS 配置 ds.automigrate(schema_v1.name, function () {} 感到困惑
    • 第二个链接失效了,不知道应该链接到哪个原始链接,但如果你能更新它会很棒。
    【解决方案3】:

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

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

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

    【讨论】:

    • 当我再次运行应用程序时,我的数据丢失了
    • 是的,它会的。因为当您对存在的表再次运行迁移时,它将重新创建它们。如果你想迁移新表,那么只在自动迁移数组中传递这些表。
    • @rkmax 他们对有数据的表有自动更新方法docs.strongloop.com/display/public/LB/…
    • 我需要做的一个小改动是将这些行放在 app.start(第一个语句)中而不是之前。在您启动应用程序之前,似乎不会加载数据源哈希。
    【解决方案4】:

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

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

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

    【讨论】:

    • 在我的情况下这似乎没有创建数据库
    【解决方案5】:

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

    【讨论】:

    • 工作就像一个魅力!谢谢!
    • 这太复杂了。改为查看this answer
    • @Overdrivr 链接的答案不完整,不能像这个答案一样处理所有情况。
    • 支持你观点的论据?这段代码只是重写了 loopback-datasource-juggler 中已经实现的内容。 documentation 很清楚。 Model to migrate. If not present, apply to all models. 自动更新也一样。
    • 这段代码也很糟糕,因为如果模型有一个不存在的错误配置数据源,它不会抛出错误,而是会跳到下一个模型并忽略它。
    【解决方案6】:

    我发现了一种简单的方法来完成这项任务。参考链接为:Clique Here

    你可以使用prototype,也可以不使用,就我而言,我没有使用。

    对于文档,您应该使用:

    
    
        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):Models可以是字符串模型名称,也可以是字符串数组(模型名称)。

    注意(2):如果不想放模型,文件中所有base属性为“PersistedModel”的模型都会更新。

    有了这个,我是这样使用的:

    自动更新函数 () { ds.autoupdate(功能(错误){ 如果(!错误){ console.log("更新了所有模型"); }别的 { console.log("发生错误:" + error); } ds.disconnect(); }); }

    我调用了:autoupdate();

    你可以把这段代码放在一个file.js中,然后调用命令行:node file.js。

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

    显然,如果你想使用自动迁移,只需将上面代码中的自动更新词替换为自动迁移即可。

    【讨论】:

      【解决方案7】:

      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');
      };
      

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

        • 这应该是公认的答案。实际上,当第一个参数是 null 时,autoupdateautomigrate 函数将自动为所有服务器模型创建/更新数据源表。见the doc
        • 你在哪里定义了这段代码?在引导文件中?服务器.js?有关系吗?有约定吗?
        • 我在 boot 文件夹中用 js 试了一下,到目前为止一切正常。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多