我应该如何将 LoopBack 框架应用程序连接到预先存在的/数据填充的 MySQL 数据库/数据源?

Posted

技术标签:

【中文标题】我应该如何将 LoopBack 框架应用程序连接到预先存在的/数据填充的 MySQL 数据库/数据源?【英文标题】:How should I connect a LoopBack Framework app to a Pre-Existing / Data Filled MySQL Database / Data Source? 【发布时间】:2017-07-22 14:02:23 【问题描述】:

此问题专门针对来自 StrongLoop(由 IBM 拥有/支持)的 LoopBack Node.js Framework。据我目前所知,这应该是一个两步过程。

    编写脚本以从现有 mysql 模式中发现/创建模型。以下是相关的官方文档:https://loopback.io/doc/en/lb3/Discovering-models-from-relational-databases.html

认为我使用以下 NPM 包成功处理了发现/模型创建部分:https://www.npmjs.com/package/loopback-discovery(可以在此处找到项目的 GitHub 存储库:https://github.com/akera-io/loopback-discovery)

    使用 AutoUpdate(通过 loopback-project/server/boot 目录中的脚本)检查以确保 MySQL DB 符合 Discovery / Creation 模块创建的模型定义。这是关于 LoopBack 的 AutoMigrate 和 AutoUpdate 函数之间区别的 *** 主题:loopback automigrate vs autoupdate

从那里我认为我应该能够访问我的 API 并访问 MySQL 数据源中的数据,但是唉......

当我完成上述步骤时,我成功地从我在 loopback-project/common/models 目录中选择的表中获取了所有模型(我的模型恰好是来自博客的帖子)。

在我的 loopback-project/server/model-config.json 中,我的 MySQL 数据库中的所有表/模型都存在,然后我将我的“帖子”模型设置为公开,以便通过 API 公开它。

由于上面讨论的 NPM 模块使用 LoopBack 和 LoopBack 数据源,我知道我可以连接到我的数据库,并且我的 loopback-project/server/datasource.js 文件正确配置了 loopback 以与我的服务器/mysql 实例对话。

当我使用 node 启动我的环回实例时。我可以点击http://0.0.0.0/explore,并且我的“帖子”模型有正确的 CRUD 选项,正如我所期望的那样。

但是。

当我尝试通过 GET Posts Api Endpoint 查询我的数据库时,我收到以下错误,表明我的表不存在(尽管它在 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)"
  

我只关心我的数据库(帖子)上的一个表,我只需要不读/写。我不确定我是否需要将所有其他模型的模型放在 common/models 目录中,或者我是否只能拥有与数据源上的“帖子”表相关的 Posts 模型,为此我尝试了两种方式没有运气。

我觉得关于 LoopBack 如何处理基于模型的架构创建,我缺少一些东西,但我还没有运气解决它。

其他一些注释/细节。

    通过 AutoMigrate 重新创建不是一个选项,因为它会删除表并重新创建,从而丢失所有数据(这是我首先需要连接的唯一原因)。

【问题讨论】:

模型是否名为“Post”?对应的表名是什么? @itssajan 模型名称是帖子,表名称是帖子。在您发表评论并在 GitHub 上看到问题后,我使用以下标志/环境变量来输出 LoopBack 生成的 SQL 查询,以查看是否提供了任何线索,为此我运行了:export DEBUG=loopback:connector:mysql这真的很有帮助,因为它表明无论出于何种原因,即使在 common/models/Posts.js 中将表设置为“posts”,生成的 SQL 查询也会使用“Posts”(大写)表名。跨度> 【参考方案1】:

如果您的模型名为"Post",则环回将在mysql 中查找Post 表。

    "name": "Post",
  "options": 
    "idInjection": false,
    "mysql": 
      "schema": "LOOPBACK",
      "table": "post"
    
  

将其添加到 post.json 文件中,它将起作用

【讨论】:

很好的答案,但我仍然有问题。直到我将 LoopBack 模型名称更改为“posts”,它才起作用!我不知道我是否应该在 GitHub 上向 LoopBack 发布更多详细信息/问题,但我接受了答案,因为解决方案是你的!谢谢@itssajan 你能把你的json文件放上去吗?

以上是关于我应该如何将 LoopBack 框架应用程序连接到预先存在的/数据填充的 MySQL 数据库/数据源?的主要内容,如果未能解决你的问题,请参考以下文章

环回 API 连接到 MongoDB Atlas

如何将 Android 应用程序连接到 MySQL 数据库? [复制]

通过 *** 将 PHP 应用程序连接到 MSSQL 时应该考虑啥?

如何将iphone设备连接到非iphone设备?

IBM Worklight 6.1 - 如何将应用程序连接到远程 Worklight 服务器?

将 MongoDB 连接到 MERN 应用程序