高级数据库API功能

生成一个数据库支持的API提供了坚实的介绍执行CRUD操作结合DreamFactory-generated API,但是你需要一些额外的火力为了成功地将这些API集成到您的项目。本章介绍了几种DreamFactory的高级数据库API-related特性,包括数据库事务等主题,通过API端点调用数据库函数,等等。

在API调用中使用数据库事务

流行数据库如MySQL、PostgreSQL, SQL Server支持事务,允许你将一组SQL操作作为一个单元。应该在这个单位的任何SQL语句失败,然后将恢复到以前执行语句,或回滚。例如,设想几个数据库表是用来管理公司供应库存和供应的地方。表创建语句可能会看起来像这样:

创建表“供应”(INT id(11)无符号不是零AUTO_INCREMENT主键,名称VARCHAR(100)默认为空,主键(id));
创建表的位置(INT id(11)无符号AUTO_INCREMENT主键,名字varchar(100)不是null, supply_id INT无符号,约束fk_supply外键(supply_id)引用供应(id));

基于这个配置,每个供应都有一个位置。我故意保持模式简单;你可能会想象为例供应表包含一个条形码字段用于跟踪每件库存。

当添加一个新的供应供应表,还增加供应的关键位置,否则我们不会知道它驻留。听起来像一个完美的机会来使用一个数据库事务,因为要么查询失败,我们希望其他查询恢复(回滚)查询问题可以解决。如果不是回滚我们插入一个孤儿记录的风险。

DreamFactory支持嵌套插入,允许您轻松地将记录插入多个表通过一个API调用。如果我们想插入一个新的供应和它的位置,我们会发出POST调用…/ _table /供应端点,传递以下JSON载荷:

{“资源”:[{“名称”:“订书机”、“locations_by_supply_id”:[{“名称”:“衣柜”}]}]}

执行调用后,检查您的数据库,您将看到新记录的供应位置表。现在改变有效载荷,交换了位置的名字字段标题:

{“资源”:[{“名称”:“订书机”、“locations_by_supply_id”:[{“标题”:“衣柜”}]}]}

数据库并不认识标题列,这意味着它不会接受INSERT语句。SQL语句是这样的:

插入位置(id、标题supply_id)值(空,“衣柜”,55);

当插入失败,DreamFactory将返回以下错误:

未能更新许多作业。批错误:并不是所有请求的记录可以被创建。

很好。但是关键是理解,尽管供应/位置映射失败,实际上是增加了订书机的记录供应表,现在是孤儿由于缺乏位置。幸运的是,很容易补救这告诉DreamFactory来封装这些插入请求在一个事务中。这是通过附加回滚= trueAPI调用URI:

…/ _table /供应?回滚= true

现在再次调用端点的有效载荷。你仍然会收到指定的错误,然而指定供应不添加到供应表,因为它是由于失败的回滚位置表插入的尝试。

使用数据库API调用的函数

所有常用的数据库支持一系列广泛的功能,可用于操纵结果集返回之前数据到客户端以及输入之前写入数据库。例如,我们的演示MySQL数据库是基于官方MySQL示例数据库。它包含表包含员工,部门,工资,销售数据等等。的销售表看起来像这样:

创建表“销售”(“id”int(11)无符号不是零AUTO_INCREMENT customer_id的int(10)无符号默认为空,“product_name”varchar(100)默认为空,“sold_at”时间戳为空默认为空万博max手机网页登录,主键(id));

销售表包含一个sold_at场有一个时间戳数据类型。因此,当从这个表通过一个API调用中检索数据,你会接收JSON输出如下:

{“资源”:[{" id ": 1、“customer_id”: 456年,“product_n万博max手机网页登录ame”:“水瓶”、“sold_at”:“2021-07-19 17:34:20 "}, {" id ": 2,“customer_id”: 343年,“product_name”:“背包”,“sold_at”:“2021-07-19”17:34:32}]}

但是你不需要假设的粒度级别,只是希望产品出售的日期。万博max手机网页登录在编写SQL时,您可以使用MySQL的日期()时间戳转换函数:

选择produ万博max手机网页登录ct_name,日期(sold_at)销售;

使用日期()当编写标准的SQL函数很容易。但这是如何通过一个API调用完成吗?幸运的是,DreamFactory的模式选项卡提供了一个非常简单的方法来修改列格式使用数据库功能。单击Schema选项卡中,选择您的基于数据库的服务,然后选择一个表。你会看到一段命名字段列举在表发现每一列:

DreamFactory表列

点击字段等sold_at和滚动列详细信息页面的底部。你会发现一段命名DB函数使用。单击+按钮,你就可以修改列的输出通过一个数据库函数:

DreamFactory数据库函数

您可以使用选择框来确定当数据库函数,这意味着你可以使用不同的功能根据HTTP方法结合使用的端点调用。

一旦配置了销售表API调用将返回一个响应看起来像这样:

{“资源”:[{" id ": 1、“customer_id”: 456年,“product_n万博max手机网页登录ame”:“水瓶”、“sold_at”:“2021-07-19”}, {" id ": 2,“customer_id”: 343年,“product_name”:“背包”,“sold_at”:“2021-07-19”}]}

创建一个虚拟字段

第二个数据库function-related特性能证明在某些情况下是有用的。假设你不想修改现有字段值使用数据库功能,而是希望创建一个新的虚拟领域。作为一个例子,考虑以下员工表:

创建表“员工”(列出的int(11)不是零,“birth_date”日期不是NULL, first_name varchar(14)不是NULL, last_name varchar(16)不是零,“性别”enum (“M”,“F”)不是NULL,“hire_date”日期不是NULL,主键(列出));

注意,它使每个员工的名字成第一个和最后一个字段。但是如果你想连接员工的名字和姓氏一起返回之前的结果吗?您可以使用MySQL的concat ()函数这样做:

选择concat (“first_name”,“”,“last_name”)从员工;

您仍然希望选择检索第一个和最后一个名字在某些用例,但也在其他获取连接的名称。为此,您可以创建一个虚拟字段。点击模式选项卡上,选择您想修改服务和表。然后点击添加字段按钮:

添加一个虚拟字段

此屏幕上您将定义虚拟领域。这样做,这是至关重要的,你点击是虚拟的吗?复选框。忽视这样做将促使DreamFactory改变实际的数据库模式!在大多数情况下这将失败由于连接的用户不具有足够的权限,但如果连接用户改变权限分配表将实际上被修改。另外指定一个字段名、标签和列类型:

定义一个虚拟字段

接下来,滚动到屏幕底部的和添加一个新的数据库条目的函数。来连接first_namelast_name字段一起我使用以下功能:

concat (“first_name”,“”,“last_name”)

保存更改后,随后的调用员工表这样的端点将生成JSON:

{“资源”({:“列出”:111年,“birth_date”:“1953-09-02”,“first_name”:“乔布斯”,“last_name”:“史密斯”,“性别”:“M”,“hire_date”:“1986-06-26”、“名称”:“史蒂夫史密斯”}]}

你也可以嵌套函数。例如我们可以把姓和名转换为大写字母,随后连接在一起使用这个语句:

concat(上(“first_name”)、“上层(last_name))

一旦到位,后续调用员工表这样的端点将生成JSON:

{“资源”({:“列出”:111年,“birth_date”:“1953-09-02”,“first_name”:“乔布斯”,“last_name”:“史密斯”,“性别”:“M”,“hire_date”:“1986-06-26”、“名称”:“史蒂夫史密斯”}]}
Baidu
map