构建和执行查询

Objective

After completing this lesson, you will be able to 创建和运行数据库查询

构建查询

在上一课中,我们为 CatalogService 创建了 submitOrder 操作。这一行动的实施尚未完成,因为我们仍然缺乏如何访问数据库表的知识。我们接下来将学习此内容。

要实施 submitOrder 操作,我们需要以下两个数据库访问:

  1. 我们希望确保订购账簿的当前库存大于或等于订购数量。为此,我们需要从数据库中选择当前库存。
  2. 如果库存中有足够的账簿,并因此执行了订单,则必须减少当前库存。这意味着我们必须相应地更新数据库中的库存。

流利 API

cds.ql 模块提供用于构建此类数据库查询的 SQL 类 API。下图显示了场景所需的查询。

通过全局对象 SELECT、INSERT、UPSERT、UPDATE 和 DELETE 使该 API 可用。

注意

或者,也可以从 cds.ql 获取这些对象,如下所示:
JavaScript
12
const cds = require('@sap/cds'); const { SELECT, INSERT, UPSERT, UPDATE, DELETE } = cds.ql;
此外,还提供了创建 cds.ql 查询对象的便捷方法。可以在 CAP 文档中找到有关具有方法(例如 read()insert()upsert()update()delete())的 CRUD 样式 API 的详细信息。

通过列出的 CRUD 对象提供的 API 设计为流利 API。这意味着这些对象上可用的方法返回相同类型的对象。可用属性(例如,所示示例中使用的 SELECT 对象的 .one 属性)也具有与其值类型相同的对象。这样可以启用链接,这使得编码直观且可读。

注意

有关所示示例中使用的方法和可用语法变式的详细信息,请参阅 CAP 文档

要标识要访问的数据库表,我们在所示示例中使用工作簿实体的 CSN 定义。这是推荐的方法。

含标记模板的流利 API

作为上述经典方法调用的备选,流利 API 也可以与已标记模板一起使用。下图显示了如何使用标记模板创建使用传统方法调用构建的查询。在这两种情况下,结果都是相同的。

注意

标记模板是一种 JavaScript 功能。使用 函数可以解析和转换模板文字 - 即使用反勾字符 (`) 分隔的文字。标记模板看起来像函数调用,其中函数名称直接放在没有括号的模板文字之前 - 例如 .where`ID=${book}`

执行查询

在上一节中,我们讨论了如何创建查询对象。但是,构造的查询不会自动执行。它们仍必须显式发送到数据库才能执行。我们现在将探讨如何实现这一目标。

注意

虽然 cds.ql 的流利 API 类似于 SQL 语法,但构造的查询对象不会锁定到 SQL 中。这意味着创建的查询可以发送到任何类型的服务执行,即不仅发送到数据库,还可以发送到其他本地或远程服务。例如,如果将查询发送到 OData 服务,则会将其转换为通过 HTTP 发送的 OData 请求。

接下来,我们将了解如何在数据库中执行查询。在此上下文中,查询对象是通过传统方法调用还是通过标记模板创建的,并不重要。在以下示例中,我们将使用经典方法调用进行查询构建。

在数据库中运行查询

通过将查询传递到 cds.db.run() 方法,在数据库上执行查询(请参见下图)。这不仅适用于 SELECT 查询(如示例中所示),还适用于编写数据库查询(如 UPDATE)。

在示例中,使用 await 运算符等待 SELECT.one 查询的结果。此结果将分配给常量 b。因此,在运行时,常量是具有属性 stock 的对象。此属性的值是在数据库中为使用 where() 方法指定的工作簿选择的库存。如果在数据库表中找不到具有指定 ID 的工作簿,则为常量 b 分配值 undefined

注意

await 运算符只能在异步函数内或模块的顶级使用。因此,我们已将 reduceStock() 方法声明为 async

正在等待查询

作为上述方法的替代方法,您还可以简单地 await 构造查询。缺省情况下,这会将查询传递到 cds.db.run() 方法。这意味着下面和前面的示例与 SELECT 查询等效:

该示例还显示了如何对数据库执行更新。

更新后,根据 submitOrder 操作的响应类型将对象返回给调用者。此对象具有属性库存,其价值为已订购账面的更新库存。

在本课的练习部分,您将找到 reduceStock() 方法的完整实施。在此实施中,如果传递的工作簿标识在数据库中不存在(即,如果常量 b 的值为 undefined),则会发出错误消息。如果账面库存小于订购数量,也会发出错误消息。

演示和练习:在 CAP 服务的实施中使用查询

注意

在练习中,在 SAP Business Application Studio 中自行执行以下演示中的分步说明。

作为练习的起点,如果已成功完成,请使用上一练习定义和实施自定义操作的结果。或者,您还可以使用以下 GitHub 资源库中的分支 13_custom_action 作为起点:

https://github.com/SAP-samples/cap-development-learning-journey

可在 GitHub 资源库的 14_queries 分支中找到模拟的完整实施。

有关资源库内容及其使用方法的详细信息,可在此处找到。

观看视频,了解如何在 CAP 服务的实施中使用查询。