確認 StrongLoopでMySQLテーブルを自動作成する




mysql 使い方 (7)

MySqlでStrongloopを使用しようとしていますが、MySqlデータベースにテーブルを移行または自動作成する方法を理解できません。

少なくともモデルをMySqlスキーマにエクスポートする方法はありますか、それとも手動でテーブルを作成する必要がありますか?

私はmysqlのデモアプリを試していて、しばらくの間ドキュメントを調べていましたが運が悪かった - http://docs.strongloop.com/display/DOC/MySQL+connector

ありがとうございます。


モデルのすべてのMySQLテーブルを更新または作成するには、以下の手順を実行します。

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


私の場合は、MySQLテーブルを手動で作成してからモデルを作成しました。 既存のMySQLテーブルについては、プロパティ名がMySQLフィールドの名前と同じであるモデルを作成します

だからここにMySQLデータベースでStrongLoop LoopBackを使用する私のステップは次のとおりです。

  1. MySQLデータベースとテーブルを作成します(または既存のデータベースを使用します)。
  2. npm install loopback-connector-mysql --saveを使用してMySQLコネクタをインストールします。
  3. MySQLデータベースの詳細をdatasources.jsonファイルに追加します。
  4. slc lb model tablename -iを使用して各テーブルのモデルを作成するか、 models.jsonファイルを編集して手動でプロパティを追加します。 (ドキュメント: http://docs.strongloop.com/display/DOC/Creating+a+LoopBack+application#CreatingaLoopBackapplication-Creatingmodels : 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-MySQLtoJSONtypeshttp://docs.strongloop.com/display/DOC/MySQL+connector#MySQLconnector-MySQLtoJSONtypes参照してください)。

app.startメソッドの前にserver.jsファイルに次の行を追加することで、モデルを簡単に移行できます。

app.datasources['mySqlConnection'].automigrate(['orders','customers', 'User', 'ACL'], function(err) {
     console.log(err);
});
  1. 必要に応じてモデルを配列に追加してください。
  2. slc runアプリケーションを実行します。

注意: mySqlConnectionは接続名です。独自の接続名に置き換えてください。


同じ種類の問題で、データベースを自動的に作成する必要がある場合は、dataSource JSONファイルでcreateDatabaseオプションを使用できます。

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

/server/boot/autoupdate.jsを作成しました。 アプリの起動時に実行されます。 JSON「model-config」および「datasources」をロードし、すべてのモデルをそれらに定義されたデータソースに移行または更新します。

# /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();

};






loopbackjs