如何进行数据转换与写入:从SQLServer到MySQL

  • 轻易云集成顾问-彭萍
### SQL Server到MySQL的数据集成:退款退货申请单表案例分析 在现代企业信息化管理中,跨系统的数据对接和集成是一项核心任务。本文将剖析一个具体的技术案例,如何通过轻易云数据集成平台,将SQL Server中的“5--巨益OMS-退款退货申请单表”高效地同步到MySQL数据库中,并命名为applyrefundorder_z。 此次项目的核心挑战包括保障数据不漏单、快速批量写入MySQL、定时可靠地抓取SQL Server接口数据,以及处理两者之间的数据格式差异和分页限流问题。为了应对这些挑战,我们采用了以下技术手段: 1. **自主实现的高吞吐量批量写入**:通过使用MySQL提供的batchexecute API,使大量数据能够快速且安全地被接收并存储,为后续业务流程提供及时准确的数据支持。 2. **集中监控与告警系统**:利用轻易云平台内置的监控机制,实时跟踪整个数据集成任务,从而确保任何异常情况都能迅速定位并解决。同时,通过设置合理的告警规则,可以在问题初现时即采取修复措施。 3. **自定义数据转换逻辑**:针对两个数据库系统可能存在的数据结构差异,自定义转换逻辑,以保证最终导入至MySQL中的数据符合业务需求。这一步骤不仅涵盖了字段映射,还涉及特定格式转换及默认值填充等操作。 4. **分页与限流策略优化**:由于源头API(select)受制于查询性能,我们设计了一套高效分页策略,结合限流机制,实现了稳定可靠的数据获取过程,有效防止因瞬间过载导致服务质量下降。 以下是具体实施步骤及相关代码示例,其中包含如何调用SQL Server接口以及向MySQL进行大规模、高效率写入操作。 ```sql -- 示例代码片段: SELECT * FROM [巨益OMS].[dbo].[RefundOrder] WHERE Date > @LastSyncDate; -- SQL Server获取增量更新记录 ``` ```mysql -- MySQL 批量插入示例: INSERT INTO applyrefundorder_z (field1, field2, ...) VALUES (?, ?, ...), (?, ?, ...), ...; -- 预编译语句以提高多条记录同时写入效率 ``` 我们将在下一部分深入探讨每个步骤实现细节,并分享实际运行过程中遇到的问题及其解决方案。 ![打通金蝶云星空数据接口](https://pic.qeasy.cloud/D34.png~tplv-syqr462i7n-qeasy.image) ### 调用源系统SQL Server接口select获取并加工数据 在轻易云数据集成平台的生命周期中,第一步是调用源系统SQL Server接口select获取并加工数据。本文将详细探讨如何通过配置元数据来实现这一过程,并分享具体的技术案例。 #### 元数据配置解析 首先,我们需要理解元数据配置中的各个字段及其作用。以下是提供的元数据配置: ```json { "api": "select", "effect": "QUERY", "method": "SQL", "number": "Id", "id": "Id", "request": [ { "field": "main_params", "label": "主参数", "type": "object", "describe": "111", "children": [ {"field": "offset", "label": "offset", "type": "int"}, {"field": "fetch", "label": "fetch", "type": "int", "value": "5000"}, {"field": "LastDateBegin", "label": "最后修改日期(开始时间)", "type": "string", "value":"{{LAST_SYNC_TIME|datetime}}" }, {"field":"LastDateEnd", "label":"最后修改日期(结束时间)", "type":"string", "value":"{{CURRENT_TIME|datetime}}" } ] } ], ... } ``` #### 配置解读与应用 1. **API和方法**: - `api`字段定义了我们使用的操作类型为`select`。 - `method`字段指定了操作的方法为`SQL`,即通过SQL语句进行查询。 2. **请求参数**: - `request`字段包含了一个对象数组,每个对象代表一个请求参数组。在本例中,只有一个名为`main_params`的参数组。 - `main_params`包含多个子参数,如`offset`, `fetch`, `LastDateBegin`, 和 `LastDateEnd`。 3. **主查询语句**: - 在`otherRequest`字段中,定义了实际执行的SQL查询语句。该语句将根据传入的参数动态生成。 #### SQL 查询语句解析 主查询语句如下: ```sql select Id, CreateDate, RefundCode, RefundType, HasGoodReturn, Payment, DescName, Title, Price, Quantity, ExpressName, ExpressNumber, Address, GoodStatus, TradeStatus, Status, RefundFee, Reason, ActualRefundFee, Created, AlipayNo, TradeId, StoreName, StoreId, RefundVersion, RefundPhase, IsRefund, HasReturn, LastDate, IsQuickRefund, TagName, ProductId, ProductCode, ProductName,SkuId,SkuName,SkuCode, DistributionAmount, IsReturned, CombProductCode, CombProductId, CombProductQuantity, SalesOrderDetailId, SalesOrderId, AuditStatus, ActionType, Oid, SkuOuterId, OuterId, SkuDesc from ApplyRefundOrder where LastDate >= :LastDateBegin and LastDate <= :LastDateEnd order by Id offset :offset rows fetch next :fetch rows only ``` 该查询语句从表 `ApplyRefundOrder` 中选择多个字段,并根据时间范围和分页参数进行过滤和排序。以下是关键点: - **时间范围过滤**:使用`:LastDateBegin` 和 `:LastDateEnd` 参数来限定查询的数据范围。这两个参数分别代表最后修改日期的开始和结束时间。 - **分页处理**:使用`:offset` 和 `:fetch` 参数来实现分页,从而避免一次性拉取过多数据导致性能问题。 #### 实际应用案例 假设我们需要从 SQL Server 中获取退款退货申请单表的数据,并将其写入 MySQL 数据库。以下是具体步骤: 1. **配置请求参数**: - 设置 `offset=0`, `fetch=5000`, 并根据上次同步时间和当前时间设置 `LastDateBegin` 和 `LastDateEnd`. 2. **执行查询**: - 使用上述 SQL 查询语句,通过轻易云平台发送请求到 SQL Server 接口。 3. **处理返回结果**: - 平台会自动处理返回的数据,包括清洗、转换等操作,然后写入目标 MySQL 数据库中的相应表。 通过这种方式,我们可以高效地实现不同系统间的数据集成,确保数据的一致性和完整性,同时大幅提升业务流程的透明度和效率。 ![电商OMS与ERP系统接口开发配置](https://pic.qeasy.cloud/S4.png~tplv-syqr462i7n-qeasy.image) ### 数据转换与写入目标平台 MySQL 的技术实现 在数据集成的生命周期中,将已经集成的源平台数据进行ETL转换,并转为目标平台 MySQL API 接口所能够接收的格式,是至关重要的一步。本文将深入探讨如何通过轻易云数据集成平台,实现这一过程。 #### 元数据配置解析 元数据配置是实现数据转换和写入的核心。以下是配置中的关键部分: ```json { "api": "batchexecute", "effect": "EXECUTE", "method": "SQL", "idCheck": true, "request": [ {"field":"Id","label":"Id","type":"int","value":"{Id}"}, {"field":"CreateDate","label":"CreateDate","type":"datetime","value":"{CreateDate}","default":"1970-01-01 00:00:00"}, {"field":"RefundCode","label":"RefundCode","type":"string","value":"{RefundCode}"}, // ...其他字段配置... ], "otherRequest": [ {"field":"main_sql","label":"主语句","type":"string","describe":"111","value":"REPLACE INTO applyrefundorder_z (Id,CreateDate,RefundCode,RefundType,HasGoodReturn,Payment,DescName,Title,Price,Quantity,ExpressName,ExpressNumber,Address,GoodStatus,TradeStatus,Status,RefundFee,Reason,ActualRefundFee,Created,AlipayNo,TradeId,StoreName,StoreId,RefundVersion,RefundPhase,IsRefund,HasReturn,LastDate,IsQuickRefund,TagName,ProductId,ProductCode,ProductName,SkuId,SkuName,SkuCode,DistributionAmount,IsReturned,CombProductCode,CombProductId,CombProductQuantity,SalesOrderDetailId,SalesOrderId,AuditStatus,ActionType,Oid,SkuOuterId,"OuterId",SkuDesc) VALUES"}, {"field":"limit","label":"limit","type":"string","value":"1000"} ], "buildModel": true } ``` #### 数据请求与清洗 在进行数据转换之前,首先需要对从源平台获取的数据进行请求与清洗。轻易云平台提供了全透明可视化的操作界面,使得这一过程更加直观和高效。 1. **字段映射**:根据元数据配置中的 `request` 部分,将源平台的数据字段映射到目标 MySQL 表中的相应字段。例如: - `{"field": "Id", "label": "Id", "type": "int", "value": "{Id}"}` 表示将源平台的 `Id` 字段映射到目标表的 `Id` 字段。 - `{"field": "CreateDate", "label": "CreateDate", "type": "datetime", "value": "{CreateDate}", "default": "1970-01-01 00:00:00"}` 表示将源平台的 `CreateDate` 字段映射到目标表的 `CreateDate` 字段,如果为空则使用默认值 `1970-01-01 00:00:00`。 2. **数据类型转换**:确保每个字段的数据类型与目标表一致。例如,将字符串类型的日期字段转换为 datetime 类型。 #### 数据转换与写入 1. **构建 SQL 语句**:根据元数据配置中的 `main_sql` 字段,构建用于插入或更新数据的 SQL 语句。这里使用的是 `REPLACE INTO`,表示如果记录存在则更新,不存在则插入。 ```sql REPLACE INTO applyrefundorder_z (Id,...SkuDesc) VALUES (?,...,?) ``` 2. **参数绑定**:将清洗后的数据绑定到 SQL 语句中对应的位置。例如: ```sql REPLACE INTO applyrefundorder_z (Id,...SkuDesc) VALUES (1,...'描述') ``` 3. **执行 SQL 语句**:通过轻易云提供的 API 接口(如 `batchexecute`),批量执行构建好的 SQL 语句,将数据写入 MySQL 数据库。 #### 实际案例 假设我们从巨益OMS系统中获取了一条退款退货申请单的数据,如下所示: ```json { "Id": 12345, "CreateDate": "2023-10-01T12:34:56", // ...其他字段... } ``` 经过清洗和转换后,我们构建如下 SQL 语句: ```sql REPLACE INTO applyrefundorder_z (Id,...SkuDesc) VALUES (12345,...'描述') ``` 然后,通过调用轻易云的数据集成 API,将该 SQL 批量执行: ```json { "api": "/batchexecute", // ...其他参数... } ``` 通过这种方式,我们可以高效地将源平台的数据转换并写入到目标 MySQL 数据库中,实现不同系统间的数据无缝对接。 以上内容详细介绍了如何利用轻易云数据集成平台,实现从巨益OMS系统到MySQL数据库的数据ETL转换和写入过程。在实际应用中,根据具体业务需求,还可以进一步优化和定制化处理逻辑,以满足更复杂的数据集成场景。 ![用友与CRM系统接口开发配置](https://pic.qeasy.cloud/T22.png~tplv-syqr462i7n-qeasy.image)