Подтвердить что ты не робот

Автоматическое создание таблицы mysql с помощью StrongLoop

Я пытаюсь использовать Strongloop с MySql, но не могу понять, как переносить или автоматически создавать таблицы в базе данных MySql.

Есть ли способ экспортировать модели в схемы MySql или мне нужно вручную создавать таблицы?

Я пытался с помощью демонстрационного приложения mysql и некоторое время просматривал документы, но не повезло - http://docs.strongloop.com/display/DOC/MySQL+connector p >

Спасибо!

4b9b3361

Ответ 2

Я создал /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();

};

Ответ 3

Вы можете просто перенести модели, добавив следующие строки в ваш файл server.js до метода app.start:

app.datasources['mySqlConnection'].automigrate(['orders','customers', 'User', 'ACL'], function(err) {
     console.log(err);
});
  • Добавьте модели в массив в соответствии с вашими потребностями.
  • Запустите приложение slc run.

Примечание. mySqlConnection - это имя соединения, замените его собственным именем подключения.

Ответ 4

Чтобы обновить и/или создать все таблицы mysql для ваших моделей:

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

Ответ 5

В моем случае я вручную создал таблицы MySQL, а затем создал модели. Для существующих таблиц MySQL я создаю модели, в которых имена свойств совпадают с именами полей MySQL.

Итак, вот мои шаги в использовании StrongLoop LoopBack с базой данных MySQL:

Ответ 6

В том же виде, если вам нужно автоматически создавать базу данных, вы можете использовать опцию createDatabase в файле данных JSON dataSource.

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

Таким образом, вам не нужно писать себе запросы для создания базы. Надеюсь, что это поможет.

Ответ 7

я обнаружил простой способ выполнить эту задачу. Ссылка: 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 - имя атрибута datasource, пример /server/datasources.json:



    {
      "x": {
        "Host": "localhost"
        "Port": 3306,
        "Database", "loopapp"
        "Password": "",
        "Name": "x"
        "User", "root"
        "Connector": "mysql"
      }
    }

Примечание (1): Модели могут быть именем модели строки или массивом строки (имена моделей).

Примечание (2): Если вы предпочитаете не ставить модели, все модели файла, базовый атрибут которого равен "PersistedModel", будут обновлены.

С этим я использовал вот так:

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

и я назвал: autoupdate();

Вы можете поместить этот код в файл .js и вызвать командную строку: node file.js.

Если вы хотите, чтобы этот файл вызывался каждый раз при запуске программы, поместите его в путь /server/boot/file.js.

Очевидно, что если вы хотите использовать automigrate, замените слово autoupdate в приведенном выше коде, выполнив автоматизацию.

Ответ 8

Ответ 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');
};