查询数据库

您的网络钩子目前在 cruisePlanCoverage 函数中使用硬编码数据。在本教程的这一步中,您将创建一个 Spanner 数据库,向其填充涵盖的目的地,并更新函数以查询该数据库。

项目配置

请务必确保您的 Dialogflow 代理和数据库位于同一项目中。 要让函数安全访问数据库,这是最简单的方法。此外,您还必须启用 Spanner API。

  1. 在创建数据库之前,请先从 Google Cloud 控制台中选择您的项目。

    转到“项目选择器”

  2. 为项目启用 Spanner API。

    启用 Spanner API

创建 Spanner 实例

首次使用 Spanner 时,您必须创建一个实例,用于分配该实例中 Spanner 数据库所使用的资源。

  1. 在 Google Cloud 控制台中,前往 Spanner 实例页面。

    转到 Spanner 实例

  2. 点击创建实例

  3. 输入 Tutorial Instance 作为实例名称。

  4. 系统会根据实例名称自动输入实例 ID。

  5. 选择您的配置中,保留默认选项 Regional,并选择您在创建函数时选择的同一区域位置

  6. 分配计算容量中,输入 100 个处理单元。这为本教程提供了最小容量。

  7. 点击创建。Google Cloud 控制台会显示您创建的实例的概览页面。

创建 Spanner 数据库

现在您已经有了实例,需要创建一个数据库。 如需创建数据库,请执行以下操作:

  1. 在实例概览页面中,点击创建数据库
  2. 输入 tutorial-database 作为数据库名称。
  3. 选择 Google 标准 SQL 数据库方言。
  4. 点击创建。Google Cloud 控制台会显示您创建的数据库的概览页面。

为数据库创建表

现在您已经有了数据库,接下来需要为数据库创建一个表。如需创建表,请执行以下操作:

  1. 在数据库概览页面的“表”部分中,点击创建表
  2. 编写 DDL 语句页面中,输入以下内容:

    CREATE TABLE Destinations (
      Destination STRING(1024),
      Covered BOOL,
    ) PRIMARY KEY(Destination);
    
  3. 点击提交。 Google Cloud 控制台会返回数据库概览页面,并显示正在进行架构更新。等待更新完成。

将数据插入表格中

现在您的数据库有了表,您需要向该表中添加数据。 要添加数据,请执行以下操作:

  1. 在数据库概览页面上的表列表中,点击“目标位置”表。Google Cloud 控制台会显示“目标表”表的架构页面。
  2. 在左侧导航菜单中,点击数据,以显示目标表的数据页面。
  3. 点击插入。 Google Cloud 控制台会显示“Destinations”表的查询页面,其中包含一个新的查询标签页,其中包含 INSERTSELECT 语句。用以下内容覆盖这些语句:

    INSERT INTO Destinations (Destination, Covered)
    VALUES('anguilla', TRUE),
          ('canada', TRUE),
          ('china', TRUE),
          ('italy', TRUE),
          ('mexico', TRUE),
          ('spain', FALSE);
    
  4. 点击运行

  5. 在左侧导航菜单中,再次点击数据,以显示目标表的数据。确认该表包含所需的数据。

更新 Cloud Function 以查询数据库

webhook 代码中的 cruisePlanCoverage 函数会检查特定环境变量是否设置了用于连接到数据库的信息。如果未设置这些环境变量,则该函数会使用硬编码的目的地列表。

现在您已设置数据库,请更新 Cloud Functions 函数以设置所需的环境变量:

  1. 打开 Cloud Functions 概览页面。

    转到 Cloud Functions 概览

  2. 点击 tutorial-Telecommunications-webhook 函数以转到其详情页面。

  3. 点击修改

  4. 打开运行时、构建和连接设置部分。

  5. 选择运行时标签页。

  6. 在“运行时环境变量”部分中添加以下变量:

    • PROJECT_ID:您的项目 ID
    • SPANNER_INSTANCE_ID:您的 Spanner 实例 ID(可能是 tutorial-instance
    • SPANNER_DATABASE_ID:您的 Spanner 数据库 ID(可能是 tutorial-database
  7. 点击下一步

  8. 点击部署

  9. 等待状态指示器显示函数已成功部署。

测试代理

您的代理现在已准备就绪,可以试用了。点击 Dialogflow 控制台中的测试代理 (Test Agent) 按钮以打开模拟器。 尝试与客服人员进行以下对话:

回合 代理
1 您好 您好!我是虚拟电信客服,我可以帮助您解决结算和计划方面的问题、排查问题、添加旅行和游轮计划。您现在需要什么帮助?
2 我想添加邮轮计划 让我看看您。您向我们提供的手机号码是多少?
3 123-123-1234 您乘船多少天?
4 7 选项 1 包含通话和文字消息。每天的费用为 $[XX]。如需了解详情,请点击以下链接:[网址]。选项 2 包括通话、短信和数据流量。每天的费用为 $[XX]。如需了解详情,请点击以下链接:[网址]。你想添加哪个游轮计划?
5 选项 1 知道了。我已经把这个计划添加到你的帐号了。在乘船期间,您可能还需要提供陆上保险。您将在哪个端口停下来?
6 意大利 您在那里停留了多少天?
7 3 好消息!意大利的陆地是免费的。大功告成!您现在还需要其他方面的帮助吗?

仔细查看代码会发现,意大利并不在涵盖的目的地的硬编码列表中。这意味着您的网络钩子已成功连接到数据库(其中包括意大利)。

问题排查

webhook 代码包含日志记录语句。如果您遇到问题,请尝试查看 Cloud Function 的日志

如果您的函数未连接到数据库,并且您在日志中看到权限错误,则可能需要修复函数使用的默认服务帐号的角色。此服务帐号的格式为 PROJECT_ID@appspot.gserviceaccount.com。您可以通过以下任一方式来解决此问题:

更多信息

如需详细了解上述步骤,请参阅: