您正在查看 Apigee Edge 說明文件。
  前往 Apigee X 說明文件。 info
1.2.1 版本
在 Cloud Spanner 資料庫上執行插入、查詢和更新作業。
這篇文章提供設定和使用此擴充功能的參考資訊。使用 ExtensionCallout 政策中的 API proxy 擴充功能前,您必須:
- 按照「建立及管理執行個體」一節的說明建立 Cloud Spanner 執行個體,然後建立資料庫。 
- 建立執行個體和資料庫後,請授予權限,讓代表擴充功能的 GCP 服務帳戶存取資料庫。如要進一步瞭解要使用的角色,請參閱「Cloud Spanner 角色」。如要進一步瞭解 Cloud Spanner 存取權控管,請參閱「套用 IAM 角色」和「Cloud Spanner 的存取權控管」。 
- 當您擁有服務帳戶,且該帳戶具有所需資料庫存取權限等級時,請使用 GCP Console 為服務帳戶產生金鑰。設定這個擴充功能時,請使用產生的金鑰 JSON 檔案內容。 
關於 Cloud Spanner
Cloud Spanner 是一項關聯資料庫服務,適用於需要高可用性、同步一致性以及交易讀取與寫入的關聯、結構化和半結構化資料。
如果您剛開始使用 Cloud Spanner,建議您參閱 Cloud Spanner 說明文件中的快速入門指南。
範例
以下範例說明如何使用 ExtensionCallout 政策設定 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>
以下 ExtensionCallout 政策會使用 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 | 資料庫中要插入資料列的表格。 | 字串 | 無。 | 是。 | 
| 列 | 要插入的資料列,以 rowsJSON 物件中的陣列表示。 | 陣列 | 無。 | 是。 | 
回應
無。
querySQL
使用含有指定參數的 SQL 陳述式查詢資料庫。參數會在 SQL 陳述式中提供,並在名稱前方加上 @ 符號;參數值則會在這個動作的 params 參數中指定。
如要進一步瞭解 Cloud Spanner 查詢語法,請參閱「查詢語法」。
語法
<Action>querySQL</Action>
<Input><![CDATA[{
  "sql" : "sql-query-statement",
  "params" : {
    "param1" : "columnValue"
  }
}]]></Input>
範例
在本範例中,查詢會從 user 資料表中擷取 username 和 email 資料欄值。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參數中的鍵。 | 字串 | 無。 | 是。 | 
| 參數 | 物件,其鍵和值是 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 的使用者電子郵件地址已更新為新的值。更新一列。
<Action>update</Action>
<Input><![CDATA[{
  "tableName" : "user",
  "rows": [{
      "username":"Liz456",
      "email":"lizzard@example.com"
  }]
}]]></Input>
要求參數
| 參數 | 說明 | 類型 | 預設 | 必填 | 
|---|---|---|---|---|
| tableName | 資料庫中應更新資料列的資料表。 | 字串 | 無。 | 是。 | 
| 列 | 要更新的資料列資料陣列。陣列中的每個實體都應包含要更新的資料列專屬 ID (例如主鍵) 值。 | 陣列 | 無。 | 是。 | 
回應
無。
設定參考資料
如要設定及部署此擴充功能,以便在 API 代理程式中使用,請使用下列說明。如要瞭解如何使用 Apigee 控制台設定擴充功能,請參閱「新增及設定擴充功能」。
常見的擴充功能屬性
每個擴充功能都有下列屬性。
| 屬性 | 說明 | 預設 | 必要 | 
|---|---|---|---|
| name | 您要為這項擴充功能設定的名稱。 | 無 | 相容 | 
| packageName | Apigee Edge 指定的擴充功能套件名稱。 | 無 | 相容 | 
| version | 擴充功能的擴充功能套件版本號碼。 | 無 | 相容 | 
| configuration | 您要新增的擴充功能專屬的設定值。請參閱「這個擴充功能套件的屬性」一文 | 無 | 相容 | 
這個擴充功能套件的屬性
請為下列專屬於此擴充功能的設定屬性指定值。
| 屬性 | 說明 | 預設 | 必填 | 
|---|---|---|---|
| 專案 ID | 包含資料庫的 GCP 專案 ID。 | 無。 | 是。 | 
| instanceId | GCP 專案中 Cloud Spanner 執行個體的 ID。 | 無。 | 是。 | 
| databaseId | Cloud Spanner 資料庫的 ID。 | 無。 | 是。 | 
| 憑證 | 輸入 Apigee Edge 主控台時,這是服務帳戶金鑰檔案的內容。透過管理 API 傳送時,這會是從服務帳戶金鑰檔案產生的 base64 編碼值。 | 無。 | 是。 |