Google Cloud Spanner 資料庫擴充功能

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

1.4.1 版

對 Cloud Spanner 資料庫執行插入、查詢和更新作業。

此內容提供設定和使用這個擴充功能的參考資料。 透過擴充功能呼叫政策使用 API Proxy 提供的擴充功能之前,您必須:

  1. 按照建立及管理執行個體的說明建立 Cloud Spanner 執行個體,並建立資料庫。

  2. 擁有執行個體和資料庫後,請授權讓代表該擴充功能的 GCP 服務帳戶存取資料庫。如要進一步瞭解要使用的角色,請參閱 Cloud Spanner 角色。如要進一步瞭解 Cloud Spanner 存取權控管,請參閱「套用 IAM 角色」和「Cloud Spanner 的存取權控管」。

  3. 如果您擁有服務帳戶具有所需資料庫存取層級的權限,請使用 GCP 控制台產生服務帳戶的金鑰。設定這項擴充功能時,請使用產生的金鑰 JSON 檔案內容。

  4. 透過設定參考資料新增及設定擴充功能時,使用產生的金鑰 JSON 檔案內容。

關於 Cloud Spanner

Cloud Spanner 是一項關聯資料庫服務,適合需要高可用性、同步一致性以及交易讀取與寫入的關聯、結構化和半結構化資料。

如果您才剛開始使用 Cloud Spanner,從 Cloud Spanner 說明文件中的快速入門導覽課程開始是很好的入門起點。

範例

以下範例說明如何使用擴充功能呼叫政策,為 Cloud Spanner 擴充功能動作設定支援。

新增資料

在以下範例中,擴充功能的 insert 動作會在使用者表格中加入新使用者。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ConnectorCallout async="false" continueOnError="true" enabled="true" name="Insert-New-User">
    <DisplayName>Insert New User</DisplayName>
    <Connector>spanner-users-products</Connector>
    <Action>insert</Action>
    <Input><![CDATA[{
        "tableName" : "user",
        "rows" : [{
          "username": "jonesy42",
          "firstName": "Floyd",
          "lastName": "Jones",
          "address": "3695 Auctor Street",
          "city": "Gresham",
          "region": "OR",
          "postalCode": "12693",
          "email": "floydster@example.com"
      }]
  }]]></Input>
</ConnectorCallout>

取得資料

在這個範例中,查詢會從 user 資料表中擷取使用者名稱和電子郵件值。

首先,AssignMessage 政策會指派 postal.code.value 變數在查詢 WHERE 子句中使用。而這只是一項範例。您的政策可能會根據用戶端要求參數來設定值。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Postal-Code">
    <AssignTo createNew="true" transport="http" type="request"/>
    <AssignVariable>
        <Name>postal.code</Name>
        <Value>86519</Value>
    </AssignVariable>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</AssignMessage>

下列 Extension callout 政策會使用 WHERE 子句中 postal.code.value 變數的內容,對資料庫執行查詢。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ConnectorCallout async="false" continueOnError="true" enabled="true" name="Get-User-Data">
    <DisplayName>Get User Data</DisplayName>
    <Connector>spanner-users-products</Connector>
    <Action>querySQL</Action>
    <Input><![CDATA[{
      "sql" : "SELECT username, email FROM user WHERE postalCode = @postalCode",
      "params" : {
        "postalCode" : "{postal.code.value}"
      }
    }]]></Input>
  <Output>spanner.userdata.retrieved</Output>
</ConnectorCallout>

下列 AssignMessage 政策隨後會使用儲存在 spanner.userdata.retrieved 變數中的擴充功能回應做為傳回給用戶端的回應。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="Get-Query-Response-Data">
    <DisplayName>Get Query Response Data</DisplayName>
    <AssignTo type="response" createNew="false"/>
    <Set>
        <Payload contentType="application/json">{spanner.userdata.retrieved}</Payload>
    </Set>
</AssignMessage>

在此範例中,回應資料會以 JSON 格式傳回,如下所示。

{
  "rows": [
    {
      "username": "freewill444",
      "email": "freewill@example.com"
    }
  ]
}

更新資料

在這個範例中,<Input> 元素包含 username (資料表的主鍵) 和 email 欄的新值。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ConnectorCallout async="false" continueOnError="true" enabled="true" name="Update-User-Data">
    <DisplayName>Update User Data</DisplayName>
    <Connector>spanner-users-products</Connector>
    <Action>update</Action>
    <Input><![CDATA[{
        "tableName" : "user",
        "rows": [{
            "username":"Liz456",
            "email":"lizzard@example.com"
        }]
    }]]></Input>
</ConnectorCallout>

動作

insert

將指定資料列插入資料庫。

語法

<Action>insert</Action>
<Input><![CDATA[{
  "tableName" : "table-to-insert-into",
  "rows" : "rows-to-insert"
}]]></Input>

範例

在以下範例中,擴充功能的 insert 動作會在使用者表格中加入新使用者。已新增一列。

<Action>insert</Action>
<Input><![CDATA[{
    "tableName" : "user",
    "rows" : [{
      "username": "jonesy42",
      "firstName": "Floyd",
      "lastName": "Jones",
      "address": "3695 Auctor Street",
      "city": "Gresham",
      "region": "OR",
      "postalCode": "12693",
      "email": "floydster@example.com"
  }]
}]]></Input>

要求參數

參數 說明 類型 預設 需要
tableName 資料庫中應插入資料列的資料表。 字串 無。 可以。
資料列 要插入的資料列,在 rows JSON 物件中以陣列表示。 陣列 無。 可以。

回應

無。

querySQL

使用 SQL 陳述式搭配指定參數查詢資料庫。SQL 陳述式會在 SQL 陳述式中提供參數,並在名稱前面加上 @ 符號;參數值可在這個動作的 params 參數中指定。

如要進一步瞭解 Cloud Spanner 查詢語法,請參閱查詢語法

語法

<Action>querySQL</Action>
<Input><![CDATA[{
  "sql" : "sql-query-statement",
  "params" : {
    "param1" : "columnValue"
  }
}]]></Input>

範例

在這個範例中,查詢會從 user 資料表擷取 usernameemail 資料欄的值。SQL 陳述式會指定由資料流變數 postal.code.value 設定的 postalCode 參數。

<Action>querySQL</Action>
<Input><![CDATA[{
  "sql" : "SELECT username, email FROM user WHERE postalCode = @postalCode",
  "params" : {
    "postalCode" : "{postal.code.value}"
  }
}]]></Input>

要求參數

參數 說明 類型 預設 需要
sql 要執行的 SQL 查詢。您可以使用「@ 結尾的參數」指定參數。這些參數名稱必須與這項操作的 params 參數中的鍵對應。 字串 無。 可以。
params 物件的鍵和值是 SQL 查詢中使用的參數名稱和值。你可以在這裡列出多個參數。 物件 無。 不會。

回應

rows 物件,包含查詢傳回的資料欄名稱/值組合陣列。例如:

{
  "rows": [
    {
      "username": "freewill444",
      "email": "freewill@example.com"
    }
  ]
}

update

使用指定資料更新資料庫中的資料列。

語法

<Input><![CDATA[{
  "tableName" : "table-with-rows-to-update",
  "rows" : "rows-to-update"
}]]></Input>

範例

在這個範例中,username 為 Liz456 的使用者電子郵件地址已更新為新值。已更新 1 個資料列。

<Action>update</Action>
<Input><![CDATA[{
  "tableName" : "user",
  "rows": [{
      "username":"Liz456",
      "email":"lizzard@example.com"
  }]
}]]></Input>

要求參數

參數 說明 類型 預設 需要
tableName 資料庫中應更新資料列的資料表。 字串 無。 可以。
資料列 要更新的列資料陣列。陣列中的每個實體都應包含該資料列要更新的專屬 ID (例如主鍵)。 陣列 無。 可以。

回應

無。

設定參考資料

如果您要設定及部署這個擴充功能,以便用於 API Proxy,請按照下列指示操作。如需使用 Apigee 控制台設定擴充功能的相關步驟,請參閱「新增及設定擴充功能」。

常見擴充功能屬性

每個擴充功能都有下列屬性。

屬性 說明 預設 必要
name 您要為這項擴充功能設定的名稱。 相容
packageName Apigee Edge 指定的擴充功能套件名稱。 相容
version 擴充功能的擴充功能套件版本號碼。 相容
configuration 您要新增的擴充功能專屬的設定值。請參閱「這個擴充功能套件的屬性」一文 相容

這個擴充功能套件的屬性

指定這個擴充功能的下列設定屬性值。

屬性 說明 預設 需要
projectId 資料庫 (包含資料庫) 的 ID。 無。 可以。
instanceId GCP 專案中的 Cloud Spanner 執行個體的 ID。 無。 可以。
databaseId Cloud Spanner 資料庫的 ID。 無。 可以。
憑證 在 Apigee Edge 控制台中輸入時,服務帳戶金鑰檔案的內容即為。透過 Management API 傳送時,是由服務帳戶金鑰檔案產生的 Base64 編碼值。 無。 可以。