使用 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
时,autoupdate
或 automigrate
函数将自动为所有服务器模型创建/更新数据源表。见the doc
你在哪里定义了这段代码?在引导文件中?服务器.js?有关系吗?有约定吗?
我在 boot 文件夹中用 js 试了一下,到目前为止一切正常。以上是关于使用 StrongLoop 自动创建 mysql 表的主要内容,如果未能解决你的问题,请参考以下文章
Strongloop:如果 Hook 操作失败,如何返回错误?
Strongloop API GET 请求不返回项目/记录计数