我应该如何将 LoopBack Framework 应用程序连接到预先存在/数据填充 MySQL 数据库/数据源?
How should I connect a LoopBack Framework app to a Pre-Existing / Data Filled MySQL Database / Data Source?
此问题专门针对来自 StrongLoop(由 IBM 拥有/支持)的 LoopBack Node.js Framework。据我所知,这应该是一个两步过程。
- 编写脚本以从现有 MySQL 架构中发现/创建模型。以下是关于此的官方文档:https://loopback.io/doc/en/lb3/Discovering-models-from-relational-databases.html
I think I successfully handled the discovery / model creation piece using the following NPM package: https://www.npmjs.com/package/loopback-discovery (GitHub repo for project can be found here: https://github.com/akera-io/loopback-discovery)
- 使用自动更新(通过 loopback-project/server/boot 目录中的脚本)检查以确保 MySQL 数据库符合发现/创建模块创建的模型定义。以下是关于 LoopBack 的 AutoMigrate 和 AutoUpdate 函数之间区别的 Whosebug 主题:
从那里我 认为 我应该能够点击我的 API 并访问 MySQL 数据源中的数据,但是唉...
当我完成上述步骤后,我成功地从 loopback-project/common/models 目录中选择的 table 中获取了所有模型(我的模型恰好是来自博客的帖子)。
在我的 loopback-project/server/model-config.json 中,我的 MySQL 数据库中的所有 tables / 模型都存在,然后我将我的 "posts" 模型设置为public 以便通过 API.
公开它
由于上面讨论的 NPM 模块使用 LoopBack 和 LoopBack 数据源,我知道我可以连接到我的数据库并且我的 loopback-project/server/datasource.js 文件正确配置环回以与我的服务器对话/mysql实例.
当我使用 node 启动我的环回实例时。我可以点击 http://0.0.0.0/explore,并且我的 'Posts' 模型有正确的 CRUD 选项,完全符合我的预期。
但是。
当我尝试通过 GET Posts Api 端点查询我的数据库时,我收到以下错误,表明我的 table 不存在(尽管它显然在 MySQL 中存在,因为我博客正在使用它并且之前的 NPM 包能够从中读取:
{
"error": {
"statusCode": 500,
"name": "Error",
"message": "ER_NO_SUCH_TABLE: Table 'my_mysqlDB.Posts' doesn't exist",
"code": "ER_NO_SUCH_TABLE",
"errno": 1146,
"sqlState": "42S02",
"index": 0,
"stack": "Error: ER_NO_SUCH_TABLE: Table 'my_mysqlDB.Posts' doesn't exist\n at Query.Sequence._packetToError (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/sequences/Sequence.js:52:14)\n at Query.ErrorPacket (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/sequences/Query.js:77:18)\n at Protocol._parsePacket (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Protocol.js:280:23)\n at Parser.write (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Parser.js:75:12)\n at Protocol.write (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Protocol.js:39:16)\n at Socket.<anonymous> (/app/AvailableTripsLBcode/node_modules/mysql/lib/Connection.js:103:28)\n at emitOne (events.js:96:13)\n at Socket.emit (events.js:188:7)\n at readableAddChunk (_stream_readable.js:176:18)\n at Socket.Readable.push (_stream_readable.js:134:10)\n at TCP.onread (net.js:551:20)\n --------------------\n at Protocol._enqueue (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Protocol.js:141:48)\n at PoolConnection.query (/app/AvailableTripsLBcode/node_modules/mysql/lib/Connection.js:208:25)\n at runQuery (/app/AvailableTripsLBcode/node_modules/loopback-connector-mysql/lib/mysql.js:186:16)\n at executeWithConnection (/app/AvailableTripsLBcode/node_modules/loopback-connector-mysql/lib/mysql.js:228:7)\n at Ping.onOperationComplete [as _callback] (/app/AvailableTripsLBcode/node_modules/mysql/lib/Pool.js:110:5)\n at Ping.Sequence.end (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/sequences/Sequence.js:86:24)\n at Ping.Sequence.OkPacket (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/sequences/Sequence.js:95:8)\n at Protocol._parsePacket (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Protocol.js:280:23)\n at Parser.write (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Parser.js:75:12)\n at Protocol.write (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Protocol.js:39:16)\n at Socket.<anonymous> (/app/AvailableTripsLBcode/node_modules/mysql/lib/Connection.js:103:28)\n at emitOne (events.js:96:13)\n at Socket.emit (events.js:188:7)\n at readableAddChunk (_stream_readable.js:176:18)\n at Socket.Readable.push (_stream_readable.js:134:10)\n at TCP.onread (net.js:551:20)"
}
}
I only care about ONE table on my DB (posts) and I only need to read not / write. I am not sure if I need models for all the other models to be in common/models directory, or if I can have ONLY my Posts model which relates to my 'posts' table on the datasource, to that end I have tried both ways with no luck.
关于 LoopBack 如何处理基于模型的模式创建,我觉得我缺少一些东西,但到目前为止我还没有运气解决它。
一些其他注意事项/细节。
- 通过 AutoMigrate 重新创建不是一个选项,因为它会删除 table 并重新创建,从而丢失所有数据(这是我首先需要连接的唯一原因)。
如果您的模型名为 "Post"
,则环回将在 mysql
.
中查找 Post
table
"name": "Post",
"options": {
"idInjection": false,
"mysql": {
"schema": "LOOPBACK",
"table": "post"
}
}
将此添加到 post.json 文件中,它将起作用
此问题专门针对来自 StrongLoop(由 IBM 拥有/支持)的 LoopBack Node.js Framework。据我所知,这应该是一个两步过程。
- 编写脚本以从现有 MySQL 架构中发现/创建模型。以下是关于此的官方文档:https://loopback.io/doc/en/lb3/Discovering-models-from-relational-databases.html
I think I successfully handled the discovery / model creation piece using the following NPM package: https://www.npmjs.com/package/loopback-discovery (GitHub repo for project can be found here: https://github.com/akera-io/loopback-discovery)
- 使用自动更新(通过 loopback-project/server/boot 目录中的脚本)检查以确保 MySQL 数据库符合发现/创建模块创建的模型定义。以下是关于 LoopBack 的 AutoMigrate 和 AutoUpdate 函数之间区别的 Whosebug 主题:
从那里我 认为 我应该能够点击我的 API 并访问 MySQL 数据源中的数据,但是唉...
当我完成上述步骤后,我成功地从 loopback-project/common/models 目录中选择的 table 中获取了所有模型(我的模型恰好是来自博客的帖子)。
在我的 loopback-project/server/model-config.json 中,我的 MySQL 数据库中的所有 tables / 模型都存在,然后我将我的 "posts" 模型设置为public 以便通过 API.
公开它由于上面讨论的 NPM 模块使用 LoopBack 和 LoopBack 数据源,我知道我可以连接到我的数据库并且我的 loopback-project/server/datasource.js 文件正确配置环回以与我的服务器对话/mysql实例.
当我使用 node 启动我的环回实例时。我可以点击 http://0.0.0.0/explore,并且我的 'Posts' 模型有正确的 CRUD 选项,完全符合我的预期。
但是。
当我尝试通过 GET Posts Api 端点查询我的数据库时,我收到以下错误,表明我的 table 不存在(尽管它显然在 MySQL 中存在,因为我博客正在使用它并且之前的 NPM 包能够从中读取:
{
"error": {
"statusCode": 500,
"name": "Error",
"message": "ER_NO_SUCH_TABLE: Table 'my_mysqlDB.Posts' doesn't exist",
"code": "ER_NO_SUCH_TABLE",
"errno": 1146,
"sqlState": "42S02",
"index": 0,
"stack": "Error: ER_NO_SUCH_TABLE: Table 'my_mysqlDB.Posts' doesn't exist\n at Query.Sequence._packetToError (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/sequences/Sequence.js:52:14)\n at Query.ErrorPacket (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/sequences/Query.js:77:18)\n at Protocol._parsePacket (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Protocol.js:280:23)\n at Parser.write (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Parser.js:75:12)\n at Protocol.write (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Protocol.js:39:16)\n at Socket.<anonymous> (/app/AvailableTripsLBcode/node_modules/mysql/lib/Connection.js:103:28)\n at emitOne (events.js:96:13)\n at Socket.emit (events.js:188:7)\n at readableAddChunk (_stream_readable.js:176:18)\n at Socket.Readable.push (_stream_readable.js:134:10)\n at TCP.onread (net.js:551:20)\n --------------------\n at Protocol._enqueue (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Protocol.js:141:48)\n at PoolConnection.query (/app/AvailableTripsLBcode/node_modules/mysql/lib/Connection.js:208:25)\n at runQuery (/app/AvailableTripsLBcode/node_modules/loopback-connector-mysql/lib/mysql.js:186:16)\n at executeWithConnection (/app/AvailableTripsLBcode/node_modules/loopback-connector-mysql/lib/mysql.js:228:7)\n at Ping.onOperationComplete [as _callback] (/app/AvailableTripsLBcode/node_modules/mysql/lib/Pool.js:110:5)\n at Ping.Sequence.end (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/sequences/Sequence.js:86:24)\n at Ping.Sequence.OkPacket (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/sequences/Sequence.js:95:8)\n at Protocol._parsePacket (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Protocol.js:280:23)\n at Parser.write (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Parser.js:75:12)\n at Protocol.write (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Protocol.js:39:16)\n at Socket.<anonymous> (/app/AvailableTripsLBcode/node_modules/mysql/lib/Connection.js:103:28)\n at emitOne (events.js:96:13)\n at Socket.emit (events.js:188:7)\n at readableAddChunk (_stream_readable.js:176:18)\n at Socket.Readable.push (_stream_readable.js:134:10)\n at TCP.onread (net.js:551:20)"
}
}
I only care about ONE table on my DB (posts) and I only need to read not / write. I am not sure if I need models for all the other models to be in common/models directory, or if I can have ONLY my Posts model which relates to my 'posts' table on the datasource, to that end I have tried both ways with no luck.
关于 LoopBack 如何处理基于模型的模式创建,我觉得我缺少一些东西,但到目前为止我还没有运气解决它。
一些其他注意事项/细节。
- 通过 AutoMigrate 重新创建不是一个选项,因为它会删除 table 并重新创建,从而丢失所有数据(这是我首先需要连接的唯一原因)。
如果您的模型名为 "Post"
,则环回将在 mysql
.
Post
table
"name": "Post",
"options": {
"idInjection": false,
"mysql": {
"schema": "LOOPBACK",
"table": "post"
}
}
将此添加到 post.json 文件中,它将起作用