生成一个数据库支持的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来封装这些插入请求在一个事务中。这是通过附加回滚= true
API调用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选项卡中,选择您的基于数据库的服务,然后选择一个表。你会看到一段命名字段
列举在表发现每一列:
点击字段等sold_at
和滚动列详细信息页面的底部。你会发现一段命名DB函数使用
。单击+
按钮,你就可以修改列的输出通过一个数据库函数:
您可以使用选择框来确定当数据库函数,这意味着你可以使用不同的功能根据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_name
和last_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”、“名称”:“史蒂夫史密斯”}]}