API低代码平台介绍4-数据库记录插入功能

数据库记录插入功能

  本篇文章我们将介绍如何使用ADI平台定义一个向目标数据库插入记录的接口,包括手工组装报文单表插入、手工组装报文多表插入、自动组装报文多表插入三种方式。无论是单表插入还是多表插入,任何一条记录写入失败,那么默认情况下API平台的整个数据插入事务都将自动回滚。
  通过本API平台,可以快速实现直接写入数据到目标数据库,常见于大数据局等单位提供一个数据库连接方式,然后要求各业务系统自行把数据写入该数据库,以实现数据归集的需求,俗称数据同步。根据restful规范,API平台的POST接口可快速实现该功能。
  值得注意的是,在数据同步场景中,当多个数据库表之间存在外键关联时,目标库几乎不会使用自增主键作为其它表的外键值,而是会使用具有唯一性的字符串作为外键关联,因为使用自增字段值的话,是无法保证源库和目标库的主键值一致性的。

1.需求说明

  根据前续文章的例子,我们已经有一个网签备案系统,数据库名为business_system,里面有幢数据、户数据、交易者数据。假设现在市数据局提供了一个他们的数据库名为dsj(大数据的缩写),并要求我们实时归集幢数据和户数据到该数据库对应的表中。
dsj数据库的幢表名为dsj_zhuangs,建表语句如下:

create table dsj_zhuangs
(
  xh bigint(20) not null primary key auto_increment comment '幢序号',
  zhdjdydm   varchar(50) not null comment '幢登记单元代码',
  zl varchar(100) comment '幢坐落'  
);
alter table dsj_zhuangs add unique (zhdjdydm);

dsj数据库的户表名为dsj_hus,建表语句如下:

create table dsj_hus
(
  xh bigint(20) not null primary key auto_increment comment '户序号',
  hdjdydm   varchar(50) not null comment '户登记单元代码',
  zhdjdydm  varchar(50) not null comment '所属幢登记单元代码',
  fbm  varchar(50) comment '房编码',
  qsc  int(4) comment '起始层',
  zhzhc  int(4) comment '终止层',
  fh varchar(50) comment '室号/部位',
  zl varchar(100) comment '房屋坐落',
  jzjg  varchar(50)  comment '建筑结构',
  ghyt  varchar(50)  comment '规划用途',
  jzmj double(18, 3) comment '建筑面积'
);

alter table dsj_hus add unique (hdjdydm);

-- 设置户表的外键:zhdjdydm
alter table dsj_hus add constraint hus_fk_zhdjdydm foreign key (zhdjdydm) references dsj_zhuangs(zhdjdydm);

接下来我们将分别使用手工组装报文单表插入、手工组装报文多表插入、自动组装报文多表插入三种方式实现该需求(注:这三种方式都不包括改造业务系统以连接目标库来写入数据,因为这样对咱们业务系统的侵入性太大,耦合度太高;我们要通过API平台实现数据插入)。

在此之前,我们需要先在API平台定义一个OAuth客户端,系统名称可以就叫"大数据平台",具体定义过程可以参考之前的文章,这里不再赘述。如图:
在这里插入图片描述

2.手工组装报文单表插入

所谓手工组装报文,即改造我们的业务系统,通过程序组装json报文,然后调用API平台的接口来完成数据插入。

2.1 实现对dsj_zhuangs表的插入

要通过API平台插入数据到数据库表,那么json报文的根节点必须有一个和表名相同的节点名称,即dsj_zhuangs(大小写不敏感),报文结构如下:

{
	"dsj_zhuangs": [{
		"zhdjdydm": "幢登记单元代码/不动产单元号",
		"zl": "幢坐落"
	}]
}

dsj_zhuangs节点可以是一个json对象(意味着只能单条数据插入)或者是一个json数组(意味着可以多条数据插入),每个json对象的属性值必须和数据库表的字段名相同(大小写不敏感)。

2.1.1 在API平台定义一个POST路由

路由编码可定义为insertZhuang2dsj,意思是插入幢数据到大数据平台。如图:
在这里插入图片描述
注意调用方式选择post。

2.1.2 在路由下定义一个分享设置

在分享设置中填写大数据平台的数据库(即目标库)连接方式。如图:
在这里插入图片描述
注意这里要填写目标数据库的连接方式。保存后可以测试数据库是否可以连接,如图:
在这里插入图片描述

2.1.3 在分享设置中定义目标库的数据库表

点击分享设置后面的[表定义]。如图:
在这里插入图片描述
在表定义界面点击[新增],填写以下字段,如图:
在这里插入图片描述
核心字段说明:
表名: 是指要操作的目标数据库表名称(大小写不敏感)。
中文名: 是指数据库表的中文名称,实事求是即可。
主键字段: 是指该数据库表的主键字段名,非必填;。
序列名: 是指用于生成该数据库表的主键值的序列非必填;一般Oracle或PostgreSql数据库才会用到。
写入顺序: 当需要写入多个表时,用来控制当前表的写入顺序,值越小表示越需要优先写入,比如父表需要优先于子表写入;这里只有一张表,使用默认值10即可。
写入条件JS: 当JS返回true时,表示需要写入该表,否则不写入;具体应用场景会在后续文章介绍。
填写完成后点击保存即可,API平台会自动解析该表的字段类型和是否可空等属性。如图:
在这里插入图片描述
点击[字段信息],如图:
在这里插入图片描述
这里的字段信息默认是该表的所有字段,同时意味着接口调用者可以发送这些字段,如果我们不想由接口调用者传入自增主键的值,那么应该在这里把"xh"字段删除。

2.1.4 调用接口完成幢表数据插入

打开在线接口文档,如图所示:
在这里插入图片描述
在这里插入图片描述
我们填写以下json数据:

{
	"dsj_zhuangs": [{
			"zhdjdydm": "110108001001GB00001F0001",
			"zl": "北京市海淀区曙光中路曙光花园智业园1幢"
		},
		{
			"zhdjdydm": "110108001001GB00001F0002",
			"zl": "北京市海淀区曙光中路曙光花园智业园2幢"
		}
	]
}

点击[试一下],如图所示:
在这里插入图片描述
可以看到接口调用成功了,再看看dsj库里是否有数据了:
在这里插入图片描述
幢数据被成功写入。

2.2 实现对dsj_hus表的插入

根据上述内容不难看出,我们需要一个新的路由,按照同样的流程进行定义,在表定义功能中定义dsj_hus表即可,目标库的配置都是一模一样的,既然这样,我们可以使用API平台的路由复制功能,复制一个路由出来进行修改即可。

2.2.1 在API平台复制一个POST路由

在路由设置列表页面选择我们要复制的路由,点击[复制]按钮,如图所示:
在这里插入图片描述
然后点击[开始复制]即可复制成功:
在这里插入图片描述

2.2.2 在分享设置中定义目标库的数据库表dsj_hus

通过路由复制功能,我们可以完全把源路由的分享设置、数据定义、表定义复制到新路由上。接下来,我们到新路由中删除原来的表定义(dsj_zhuangs),添加新的表定义(dsj_hus)即可。如图:
在这里插入图片描述

2.2.3 调用接口完成户表数据插入

打开在线接口文档,如图所示:
在这里插入图片描述
在这里插入图片描述
我们填写以下json数据:

{
	"dsj_hus": {
		"hdjdydm": "110108001001GB00001F00010003",
		"zhdjdydm": "110108001001GB00001F0001",
		"fbm": "fbm0003",
		"qsc": 1,
		"zhzhc": 1,
		"fh": "103",
		"zl": "北京市海淀区曙光中路曙光花园智业园1幢B座1-103",
		"jzjg": "钢结构",
		"ghyt": "住宅",
		"jzmj": 183.00
	}
}

点击[试一下],如图所示:
在这里插入图片描述

可以看到接口调用成功了,再看看dsj库里是否有数据了:
在这里插入图片描述
户数据被成功写入。

3.手工组装报文多表插入

3.1 在API平台复制一个POST路由

单表插入大家已经明白如何实现了,要实现多表插入,同样很简单,只需要在表定义的时候把这些表都定义进去即可。
我们还是复制一个路由(insertHu2dsj),填写新的路由编码和路由名称。如图:
在这里插入图片描述

3.2 在分享设置中定义目标库的数据库表dsj_zhuangs

复制之后已经有dsj_hus的表定义了,我们追加dsj_zhuangs的表定义即可,同时修改dsj_zhuangs的写入顺序要小于dsj_hus的写入顺序(即写库的时候要先写幢表,再写户表)。如图:
在这里插入图片描述

3.3 调用接口完成幢表和户表数据插入

打开在线接口文档,如图所示:
在这里插入图片描述

我们填写以下json数据:

{
	"dsj_zhuangs": [{
			"zhdjdydm": "110108001001GB00001F0001",
			"zl": "北京市海淀区曙光中路曙光花园智业园1幢"
		},
		{
			"zhdjdydm": "110108001001GB00001F0002",
			"zl": "北京市海淀区曙光中路曙光花园智业园2幢"
		}
	],
	"dsj_hus": {
		"hdjdydm": "110108001001GB00001F00010003",
		"zhdjdydm": "110108001001GB00001F0001",
		"fbm": "fbm0003",
		"qsc": 1,
		"zhzhc": 1,
		"fh": "103",
		"zl": "北京市海淀区曙光中路曙光花园智业园1幢B座1-103",
		"jzjg": "钢结构",
		"ghyt": "住宅",
		"jzmj": 183.00
	}
}

首先我们清空dsj库中之前已经写入的数据(否则唯一键冲突接口会报错),然后点击[试一下],如图所示:
在这里插入图片描述

可以看到接口调用成功了,再看看dsj库里是否有数据了:
幢表:
在这里插入图片描述
户表:
在这里插入图片描述
两个表的数据都被成功写入。

4.自动组装报文多表插入

所谓自动组装报文,就是通过API平台的数据查询功能组装出约定的json报文格式,再把报文转发给另一个路由。这里会引出API平台的一个新功能,即请求转发,下面让我们看看如何实现。
思路: 定义一个路由,该路由接收一个或多个幢不动产单元号,然后编写sql查询这些不动产单元号对应的幢数据和户数据,最终把查询到数据转发到我们刚才定义的insert2dsj路由上,完成数据插入。
这么做的好处是什么? 减轻了业务系统组装报文的工作量,业务系统只需要传入极少的参数(幢不动产单元号)即可完成数据同步。

4.1 在API平台定义一个GET路由

如果以前定义过类似的查询接口,那么我们可以使用路由复制功能;不管是复制还是从头定义,这里都不再赘述(但是我要偷偷的告诉你:为了适应不同系统的对接需求,API平台的POST路由其实也能查库,从请求的json中获取查询条件而已,原理是一样的),下面展示一些关键页面的截图。
get路由:
在这里插入图片描述

4.2 在GET路由下新增一个分享设置

在这里插入图片描述
可以看到这个分享设置既需要连数据库(用来查询数据组装报文),还需要转发到另一个接口(我们前面定义的insert2dsj),由于是ADI平台自己转发给自己的接口,因此目标系统建议选择"adi"。

4.3 在分享设置下定义sql

同样的,我们需要按照数据写入的标准查询得到以下json报文格式:

{
	"dsj_zhuangs": [{
			"zhdjdydm": "110108001001GB00001F0001",
			"zl": "北京市海淀区曙光中路曙光花园智业园1幢"
		},
		{
			"zhdjdydm": "110108001001GB00001F0002",
			"zl": "北京市海淀区曙光中路曙光花园智业园2幢"
		}
	],
	"dsj_hus": [{
		"hdjdydm": "110108001001GB00001F00010003",
		"zhdjdydm": "110108001001GB00001F0001",
		"fbm": "fbm0003",
		"qsc": 1,
		"zhzhc": 1,
		"fh": "103",
		"zl": "北京市海淀区曙光中路曙光花园智业园1幢B座1-103",
		"jzjg": "钢结构",
		"ghyt": "住宅",
		"jzmj": 183.00
	}]
}

也就是定义两条sql语句,分别如下:
查询幢数据的sql:

select z.ZHDJDYDM,z.ZL from zhuang z where z.ZHDJDYDM in (request~zhdjdydms~)

因为我们要支持同时插入多个幢,因此这里使用in查询。
查询户数据的sql:

SELECT
	h.HDJDYDM,
	z.ZHDJDYDM,
	h.FBM,
	h.QSC,
	h.ZHZHC,
	h.FH,
	h.ZL,
	h.JZJG,
	h.GHYT,
	h.JZMJ 
FROM
	h
	JOIN zhuang z ON h.ZXH = z.ZXH 
	AND z.ZHDJDYDM IN (request ~zhdjdydms~)

sql定义完成后如图所示:
在这里插入图片描述

4.4 调用接口完成幢表和户表数据插入

首先我们清空dsj库中之前已经写入的数据(否则唯一键冲突接口会报错)。打开在线接口文档,如图所示:
在这里插入图片描述

入参填写两个幢的幢登记单元代码(用中括号把多个值括号来以实现in查询的多个入参):[“110108001001GB00001F0001”,“110108001001GB00001F0002”],
然后点击[试一下],如图所示:
在这里插入图片描述
哎呀,怎么报错了?
这是因为如果在分享设置中配置了请求转发到目标接口,那么就必须告诉API平台如何判断目标接口是否调用成功,因此,我们需要在分享设置的扩展配置中填写以下内容:

{
	"statenode": "type",
	"successvalue": "success",
	"datanode": "data",
	"errornode": "data"
}

扩展配置接收的是一个json对象,用于无限扩展API平台的功能,在扩展配置中还有很多其它可配置的功能,今后会一一介绍。这几个字段的含义:
statenode: 第三方接口响应json中标识本次调用成功与否字段的key值(多层使用 “.” 隔开),和succcessvalue搭配使用;如果没有明确字段用来标识成功与否,则无需配置;按照咱们API平台的响应规范,因此这里值为"type"。
successvalue: 第三方接口响应json中标识成功与否字段的value值(多个值用“,”隔开,例如200和201都表示成功);如果没有配置statenode,则无需配置succcessvalue;按照咱们API平台的响应规范,因此这里值为"success"。
datanode: 请求转发时必须配置,判断第三方返回成功后,从哪个json节点取对应的业务数据(多层使用 “.” 隔开);注:当值配置为bitWholeBody的时候,表示把第三方的整个响应body作为业务数据(一般不会配置为bitWholeBody);按照咱们API平台的响应规范,因此这里值为"data"。
errornode: 请求转发时必须配置,当判定第三方接口调用失败后,API平台也会响应失败,失败提示信息为第三方的失败信息(多层使用 “.” 隔开);按照咱们API平台的响应规范,因此这里值为"data"。
总结起来描述就是: API平台通过目标接口响应的statenode节点值获取目标接口的响应状态,当statenode节点值在successvalue节点值之中时,认定本次调用成功,然后从datanode节点取出目标接口响应的业务数据,否则认定本次调用失败,然后从errornode节点取出目标接口响应的失败原因。如果没有配置statenode(例如百度云的接口可能没有明确的字段告诉我们成功与否),那么当errornode节点有值时,就认为目标接口调用失败。
我们把扩展配置加上,如图所示:
在这里插入图片描述
保存后,回到刚才的在线接口文档页面,再此点击“试一下”,如图所示:
在这里插入图片描述
可以看到接口调用成功了,再看看dsj库里是否有数据了:
幢表:
在这里插入图片描述

户表:
在这里插入图片描述

两个表的数据都被成功写入。

5.查询接口调用日志

通过日志查询,我们能清晰的看到两个接口的日志详情。
在这里插入图片描述

接口queryData4dsj的日志:
在这里插入图片描述
接口queryData4dsj的日志:
在这里插入图片描述

到这里,通过API平台实现数据库记录插入的几种方式就讲完啦,后续我将继续介绍ADI平台其它的重要功能,谢谢大家的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/676819.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kvm学习 - 迅速上手示例

目录 kvmtool kvmsample kvmtool GitHub - kvmtool/kvmtool: Stand-alone Native Linux KVM Tool repoStand-alone Native Linux KVM Tool repo. Contribute to kvmtool/kvmtool development by creating an account on GitHub.https://github.com/kvmtool/kvmtool.git cd …

17.Redis之主从复制

1.主从复制是怎么回事? 分布式系统, 涉及到一个非常关键的问题: 单点问题 单点问题:如果某个服务器程序, 只有一个节点(只搞一个物理服务器, 来部署这个服务器程序) 1.可用性问题,如果这个机器挂了,意味着服务就中断了~ 2.性能/支持的并发量也是比较有限…

C语言学习:数据类型

一、 为什么要引入数据类型 • 计算机中每个字节都有一个地址(类似门牌号) • CPU通过 地址 来访问这个字节的空间 0x20001103 1 0 0 1 0 0 1 1 0x20001102 1 1 1 0 1 1 1 0 0x20001101 1 1 1 1 0 1 0 1 0x20001100 0 …

【UML用户指南】-06-面向对象建模-关系(relationship)

目录 1、面向对象建模常见的关系 2、关系的组成元素 3、依赖关系 4、泛化关系 5、关联关系 关联的四种修饰 1.名称 2.角色 3.多重性 4.聚合 6、常用建模技术 6.1、对简单依赖建模 6.2、对单继承建模 6.3、对结构关系建模 1、面向对象建模常见的关系 依赖 &#x…

flask轻松入门,概念讲解

Hello World Flask 是轻量级web框架,仅保留了核心功能: 请求响应处理模板渲染URL路由 文章目录 Hello Worldflask命令模式python命令模式两种模式对比修改入口文件配置flask命令修改python命令修改 修改端口和地址flask命令修改python命令修改 修改 URL …

jupyter之plt 画图弹出窗口展示图片以及静态图片切换方法

1. jupyter出图的三种方式 在python的Jupyter Notebook中,使用matplotlib绘制动态图形时,可能出现只显示一张静态图像。 这是因为在notebook中使用plt绘图共有三种模式: %matplotlib inline:这是默认的模式,输出的图片…

JavaScript 基础 - 对象

对象 对象是一种无序的数据集合&#xff0c;可以详细的描述描述某个事物。 注意数组是有序的数据集合。它由属性和方法两部分构成。 语法 声明一个对象类型的变量与之前声明一个数值或字符串类型的变量没有本质上的区别。 <script>let 对象名 {属性名&#xff1a;属性值…

【OPENMV】学习记录 (持续更新)

一、图像 1 设置彩色&#xff0f;黑白&#xff1a; sensor.set_pixformat() 设置像素模式。 sensor.GRAYSCALE: 灰度&#xff0c;每个像素8bit。sensor.RGB565: 彩色&#xff0c;每个像素16bit。 2 设置图像大小&#xff1a; sensor.set_framesize() 设置图像的大小 sensor.…

前端优化之图片压缩——tinyPNG

今天前端前辈新介绍的一个压缩图片的工具——tinyPNG&#xff0c;地址&#xff1a;TinyPNG – Compress WebP, PNG and JPEG images intelligently可以将图片压缩&#xff0c;进行优化。 一、使用方法——手动压缩 将超过200kb的图片拖到我标注的红框框里&#xff0c;拖到这里…

如何快速定位到影响mysql cpu飙升的原因——筑梦之路

通常我们只需要执行show processlist 进行查看&#xff0c;一般执行时间最长的SQL八九不离十就是罪魁祸首&#xff0c;但当show processlist的输出有近千条&#xff0c;那么很难第一眼就发现有问题的SQL&#xff0c;那么如何快速找到呢&#xff1f;其实也非常简单。我们知道mys…

多卡聚合智能融合通信设备在无人机无线视频传输应用

无人驾驶飞机简称“无人机”&#xff0c;是利用(无线电)遥控设备和自备的程序控制装置操纵的不载人飞行器&#xff0c;现今无人机在航拍、农业、快递运输、测绘、新闻报道多个领域中都有深度的应用。 无人机无线视频传输保证地面人员利用承载的高灵敏度照相机可以进行不间断的画…

HCIA--OSPF实验(复习)

实验拓扑&#xff1a; 实验思路&#xff1a; 1.规划IP&#xff0c;配置环回&#xff0c;接口IP 2.把R1&#xff0c;R2优先级改为0&#xff0c;让R1、R2放弃选举&#xff0c; [r1]interface g0/0/0 [r1-GigabitEthernet0/0/0]ospf dr-priority 0 <r1>reset ospf…

【linux】线程同步和生产消费者模型

线程同步 当我们多线程访问同一个临界资源时&#xff0c;会造成并发访问一个临界资源&#xff0c;使得临界资源数据不安全&#xff0c;我们引入了锁的概念&#xff0c;解决了临界资源访问不安全的情况&#xff0c;对于线程而言竞争锁的能力有强有弱&#xff0c;对于之前就抢到…

图形学初识--颜色混合

文章目录 前言正文为什么要有颜色混合&#xff1f;颜色混合常见实现方式&#xff1f;上述颜色混合注意点 结尾&#xff1a;喜欢的小伙伴点点关注赞哦! 前言 本章节补充一下颜色混合的内容&#xff0c;主要包含&#xff1a;为什么要有颜色混合&#xff1f;颜色混合常实现方式&a…

外星人Alienware x17R1 原厂Windows11系统

装后恢复到您开箱的体验界面&#xff0c;包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http://w…

全文检索-ElasticSearch

1.基本概念 1.Index索引 动词&#xff1a;相当于MySQL中的insert&#xff1b; 名词&#xff1a;相当于MySQL中的DataBase&#xff1b; 2.Type&#xff08;类型&#xff09; 在Index&#xff08;索引&#xff09;中&#xff0c;可以定义一个或多个类型 类似于MySQL中的Tab…

Docker大学生看了都会系列(二、2.1Mac通过Homebrew安装Docker)

系列文章目录 第一章 Docker介绍 第二章 2.1 Mac通过Homebrew安装Docker 第二章 2.2 CentOS安装Docker 文章目录 前言Mac通过Homebrew安装本机环境系统要求terminal命令安装查看安装信息配置阿里云镜像加速登陆阿里云配置加速地址其他国内加速地址 总结 前言 在上一章了解了Do…

步进电机双闭环细分控制(matlab仿真)内含课设等参考文件

1.1 步进电机工作原理 步进电机是一种用电脉冲进行控制&#xff0c;将电脉冲信号转换成相位移的电机&#xff0c;其机械位移和转速分别与输入电机绕组的脉冲个数和脉冲频率成正比,每一个脉冲信号可使步进电机旋转一个固定的角度。脉冲的数量决定了旋转的总角度&#xff0c;脉…

FebHost:什么是国别国外域名以及用途?

在数字时代的浪潮中&#xff0c;互联网如同一张无形的网&#xff0c;将全球的人们紧密相连。尽管世界因此变得“更小”&#xff0c;但在网络上展示个人或企业身份时&#xff0c;标明国家归属或地理位置依然显得格外重要。今天&#xff0c;我们将深入探讨国别域名的重要性、使用…

查看所用数据库的版本

通过查询 SELECT VERSION();