使用 StrongLoop 自动创建 mysql 表

Posted

技术标签:

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

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

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

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

谢谢!

【问题讨论】:

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

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

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

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

【讨论】:

【参考方案2】:

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

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

Data sources and connectors

【讨论】:

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);
);
    根据需要将模型添加到阵列中。 通过slc run运行应用程序。

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

【讨论】:

当我再次运行应用程序时,我的数据丢失了 是的,它会的。因为当您对存在的表再次运行迁移时,它将重新创建它们。如果你想迁移新表,那么只在自动迁移数组中传递这些表。 @Ben 它在这里做docs.strongloop.com/display/public/LB/… @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 试了一下,到目前为止一切正常。

以上是关于使用 StrongLoop 自动创建 mysql 表的主要内容,如果未能解决你的问题,请参考以下文章

Strongloop可以生成字符串uid吗?

值不是字符串 - StrongLoop

Strongloop:如果 Hook 操作失败,如何返回错误?

Strongloop API GET 请求不返回项目/记录计数

苹果swift中Strongloop的环回iOS客户端SDK

centos6 部署strongloop