使用RDS資料 API - Amazon Aurora

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用RDS資料 API

透過使用RDS資料 API(資料 API),您可以使用 Web 服務介面來連接 Aurora 資料庫叢集。資料API不需要持續連線至資料庫叢集。相反地,它提供安全的HTTP端點並與 整合 AWS SDKs。您可以使用端點來執行SQL陳述式,而不需要管理連線。

使用者不需要將憑證與 呼叫傳遞給 Data API,因為 Data API使用儲存在 中的資料庫憑證 AWS Secrets Manager。若要在 Secrets Manager 中儲存憑證,必須授予使用者適當的許可,才能使用 Secrets Manager 以及 Data API。如需授權使用者的詳細資訊,請參閱授權對RDS資料的存取 API

您也可以使用 Data API將 Amazon Aurora 與其他 AWS 應用程式整合,例如 AWS Lambda AWS AppSync、 和 AWS Cloud9。資料API提供更安全的方式來使用 AWS Lambda。它可讓您存取資料庫叢集,而不需要設定 Lambda 函數即可存取虛擬私有雲端 () 中的資源VPC。如需詳細資訊,請參閱AWS LambdaAWS AppSyncAWS Cloud9

您可以在建立 Aurora 資料庫叢集API時啟用資料。您也可以稍後修改組態。如需詳細資訊,請參閱啟用RDS資料 API

啟用資料 之後API,您也可以使用查詢編輯器執行臨時查詢,而無需設定查詢工具在 中存取 AuroraVPC。如需詳細資訊,請參閱使用 Aurora 查詢編輯器

區域和版本可用性

如需適用於 Data 的區域和引擎版本的相關資訊API,請參閱下列章節。

叢集類型 區域和版本可用性

Aurora PostgreSQL 已佈建和 Serverless v2

API 使用 Aurora PostgreSQL Serverless v2 和 佈建的資料

Aurora MySQL 佈建和無伺服器 v2

API 使用 Aurora MySQL Serverless v2 和 佈建的資料

Aurora PostgreSQL Serverless v1

API Aurora PostgreSQL Serverless v1 的資料

Aurora MySQL Serverless v1

API Aurora MySQL Serverless v1 的資料

如果您在API透過命令列界面或 FIPS 存取資料時需要密碼編譯模組,API請使用 FIPS 端點。如需可用FIPS端點的詳細資訊,請參閱聯邦資訊處理標準 (FIPS) 140-2

RDS 資料的限制 API

RDS 資料 API(資料 API) 具有下列限制:

  • 您只能在資料庫叢集中的寫入器執行個體上執行資料API查詢。不過,寫入器執行個體可以接受寫入和讀取查詢。

  • 使用 Aurora 全域資料庫,您可以在主要和次要資料庫叢集API上啟用資料。不過,在次要叢集提升為主要叢集之前,它沒有寫入器執行個體。因此,您傳送至次要 的資料API查詢會失敗。提升的次要 具有可用的寫入器執行個體後,該資料庫執行個體上的資料API查詢應該會成功。

  • 具有 RDS Data API for Aurora MySQL 的效能洞察不支援 Top 主機Top 應用程式檢視。

  • T 資料庫執行個體類別API不支援資料。

  • 用於 Aurora Serverless v2 和佈建的資料庫叢集,RDS資料API不支援某些資料類型。如需支援的類型清單,請參閱 RDS 資料API與 Serverless v2 和 佈建的比較,以及 Aurora Serverless v1

  • 對於 Aurora PostgreSQL 第 14 版及更新版本資料庫,資料API僅支援scram-sha-256密碼加密。

  • 回應大小限制為 1 MiB。若呼叫傳回的回應資料超過 1 MiB,系統就會終止呼叫。

  • 用於 Aurora Serverless v1,每秒請求數上限為 1,000。對於所有其他支援的資料庫,沒有限制。

  • 資料庫傳回的結果集中,資料API大小限制為每列 64 KB。請確定結果集中的每一列都等於或小於 64 KB。

RDS 資料API與 Serverless v2 和 佈建的比較,以及 Aurora Serverless v1

RDS 資料的最新增強功能API讓它適用於使用 PostgreSQL 或 MySQL 引擎最新版本的叢集。這些叢集可以設定為使用 Aurora Serverless v2,或佈建的執行個體類別,例如 db.r6gdb.r6i

下表說明使用 RDS的資料 API(資料API) 之間的差異 Aurora Serverless v2 和佈建的資料庫叢集,以及 Aurora Serverless v1 資料庫叢集。Aurora Serverless v1 資料庫叢集使用serverless引擎模式。佈建的資料庫叢集使用provisioned引擎模式。同時 Aurora Serverless v2 資料庫叢集也會使用provisioned引擎模式,並包含一或多個 Aurora Serverless v2 具有執行個體類別的資料庫db.serverless執行個體。

差異 Aurora Serverless v2 和 已佈建 Aurora Serverless v1
每秒請求數上限 無限制 1,000
使用 或 啟用或停用現有資料庫API上的資料 RDS API AWS CLI
  • RDS API – 使用 EnableHttpEndpointDisableHttpEndpoint操作。

  • AWS CLI – 使用 enable-http-endpointdisable-http-endpoint操作。

  • RDS API – 使用 ModifyDBCluster操作,並在適用false時指定 EnableHttpEndpoint 參數的 true或 。

  • AWS CLI – 如適用,將 modify-db-cluster操作與 --enable-http-endpoint--no-enable-http-endpoint選項搭配使用。

CloudTrail 事件 來自資料API呼叫的事件是資料事件。預設會在追蹤中自動排除這些事件。如需詳細資訊,請參閱在 AWS CloudTrail 追蹤中包含資料 API 事件 來自資料API呼叫的事件是管理事件。預設情況下,這些事件會自動包含在追蹤中。如需詳細資訊,請參閱從 AWS CloudTrail 追蹤排除資料 API 事件 (Aurora Serverless v1僅限)
多陳述式支援 不支援多陳述式。在此情況下,資料會API擲回 ValidationException: Multistatements aren't supported 對於 Aurora Postgre SQL,多陳述式只會傳回第一個查詢回應。對於 Aurora My SQL,不支援多陳述式。
BatchExecuteStatement 更新結果中產生的欄位物件為空白。 更新結果中產生的欄位物件包含插入的值。
執行SQL 不支援 已棄用
ExecuteStatement

ExecuteStatement 不支援擷取分段陣列資料欄。在此情況下,資料會API擲回 UnsupportedResultException

資料API不支援某些資料類型,例如幾何和貨幣類型。在此情況下,資料會API擲回 UnsupportedResultException: The result contains the unsupported data type data_type

如需RDS資料從每個 Aurora 資料庫引擎API支援的資料類型清單,請參閱 資料API操作參考

ExecuteStatement 支援擷取分段陣列資料欄和所有進階資料類型。

授權對RDS資料的存取 API

使用者只有在獲得授權時才可以叫用RDS資料 API(資料 API) 操作。您可以API連接定義其權限的 AWS Identity and Access Management (IAM) 政策,授予使用者使用資料的權限。如果您使用角色,也可以將政策連接至IAM角色。 AWS 受管政策 AmazonRDSDataFullAccess包含資料 的許可API。

AmazonRDSDataFullAccess政策也包含使用者從 取得秘密值的許可 AWS Secrets Manager。使用者需要使用 Secrets Manager 來存放秘密,以便他們在呼叫 Data 時使用API。使用秘密表示使用者不需要在對資料 的呼叫中包含其目標資源的資料庫憑證API。資料API透明地呼叫 Secrets Manager,允許 (或拒絕) 使用者對秘密的請求。如需設定秘密以搭配 Data 使用的資訊API,請參閱 在 中存放資料庫憑證 AWS Secrets Manager

AmazonRDSDataFullAccess政策提供 資源的完整存取權 (透過資料 API)。您可以定義自己的政策來指定資源的 Amazon Resource Name (ARN),以縮小範圍。

例如,下列政策顯示使用者存取 所識別API資料庫叢集資料所需的最低許可範例ARN。該政策包括存取 Secrets Manager 和取得使用者資料庫執行個體授權所需的許可。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "SecretsManagerDbCredentialsAccess", "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": "arn:aws:secretsmanager:*:*:secret:rds-db-credentials/*" }, { "Sid": "RDSDataServiceAccess", "Effect": "Allow", "Action": [ "rds-data:BatchExecuteStatement", "rds-data:BeginTransaction", "rds-data:CommitTransaction", "rds-data:ExecuteStatement", "rds-data:RollbackTransaction" ], "Resource": "arn:aws:rds:us-east-2:111122223333:cluster:prod" } ] }

建議您ARN針對政策陳述式中的「資源」元素使用特定的 (如範例所示),而非萬用字元 (*)。

使用標籤型授權

RDS Data API(Data API) 和 Secrets Manager 都支援標籤型授權。標籤是標記資源的鍵值對,例如RDS叢集,具有額外的字串值,例如:

  • environment:production

  • environment:development

您可以將標籤套用至資源,以進行成本配置、作業支援、存取控制和許多其他原因。(如果您的資源上尚未有標籤,且您想要套用標籤,您可以在標記 Amazon RDS 資源 中進一步了解。) 您可以使用政策陳述式中的標籤來限制對使用這些標籤標記的RDS叢集的存取。舉例來說,Aurora 資料庫叢集可能具有用來將其環境標識為生產或開發的標籤。

下列範例顯示如何在政策陳述式中使用標籤。此陳述式需要叢集和傳入資料API請求的秘密都有environment:production標籤。

以下是套用政策的方式:當使用者使用資料 進行呼叫時API,請求會傳送至 服務。資料API首先會驗證在請求中ARN傳遞的叢集是否標記 environment:production。然後,它會呼叫 Secrets Manager 擷取請求中的使用者秘密值。Secrets Manager 還會驗證使用者的秘密是否被標記為 environment:production。如果是這樣,資料API就會使用使用者資料庫密碼的擷取值。最後,如果這也是正確的,則會為使用者成功叫用資料API請求。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "SecretsManagerDbCredentialsAccess", "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": "arn:aws:secretsmanager:*:*:secret:rds-db-credentials/*", "Condition": { "StringEquals": { "aws:ResourceTag/environment": [ "production" ] } } }, { "Sid": "RDSDataServiceAccess", "Effect": "Allow", "Action": [ "rds-data:*" ], "Resource": "arn:aws:rds:us-east-2:111122223333:cluster:*", "Condition": { "StringEquals": { "aws:ResourceTag/environment": [ "production" ] } } } ] }

此範例顯示 rds-data和 Data API and Secrets Manager secretsmanager 的個別動作。但是,您可以合併動作並以許多不同的方式定義標籤條件,以支援您的特定使用案例。如需詳細資訊,請參閱使用 Secrets Manager 的身分型政策 (IAM 政策)

在政策的「條件」元素中,您可以從以下選項中選擇標籤鍵:

  • aws:TagKeys

  • aws:ResourceTag/${TagKey}

若要進一步了解資源標籤和如何使用 aws:TagKeys,請參閱使用 AWS 資源標籤 控制資源的存取

注意

資料API和 AWS Secrets Manager 授權使用者。如果您沒有政策中定義之所有動作的許可,您會收到 AccessDeniedException 錯誤訊息。

在 中存放資料庫憑證 AWS Secrets Manager

當您呼叫RDS資料 API(資料API) 時,您可以在 Secrets Manager 中使用秘密來傳遞 Aurora 資料庫叢集的憑證。若要以這種方式傳遞憑證,您可以指定秘密的名稱或秘密的 Amazon Resource Name (ARN)。

在秘密中存放資料庫叢集登入資料
  1. 使用 Secrets Manager 建立秘密,其中含有 Aurora 資料庫叢集的登入資料。

    如需說明,請參閱《AWS Secrets Manager 使用者指南》中的建立資料庫機密

  2. 使用 Secrets Manager 主控台檢視您建立的秘密詳細資訊,或執行 aws secretsmanager describe-secret AWS CLI 命令。

    請注意秘密的名稱和 ARN 。您可以在呼叫 Data 時使用它們API。

如需使用 Secrets Manager 的詳細資訊,請參閱 AWS Secrets Manager 使用者指南

若要了解 Amazon Aurora 如何管理身分和存取管理,請參閱 Amazon Aurora 如何與 搭配使用IAM

如需建立IAM政策的詳細資訊,請參閱 IAM 使用者指南 中的建立IAM政策。如需將IAM政策新增至使用者的相關資訊,請參閱 IAM 使用者指南 中的新增和移除IAM身分許可

啟用RDS資料 API

若要使用RDS資料 API(資料 API),請為 Aurora 資料庫叢集啟用它。您可以在建立或修改資料庫叢集API時啟用資料。

注意

叢集的資料是否API可用取決於您的 Aurora 版本、資料庫引擎和 AWS 區域。對於較舊的 Aurora 版本,資料API僅適用於 Aurora Serverless v1 叢集。對於較新的 Aurora 版本,Data API適用於同時使用已佈建 和 的叢集 Aurora Serverless v2 執行個體。若要檢查您的叢集是否可以使用資料 API,請參閱 Data 的支援區域和 Aurora 資料庫引擎 RDS API

建立資料庫API時啟用RDS資料

當您建立支援RDS資料 API(資料 API) 的資料庫時,您可以啟用此功能。下列程序說明如何在使用 AWS Management Console、 AWS CLI或 RDS 時執行此操作API。

若要在建立資料庫叢集API時啟用資料,請選取建立資料庫頁面的連線區段中的啟用RDS資料API核取方塊,如下列螢幕擷取畫面所示。

建立資料庫頁面上的連線區段,並選取啟用RDS資料API核取方塊。

如需如何建立可使用RDS資料 的 Aurora 資料庫叢集的指示API,請參閱下列內容:

若要在建立 Aurora 資料庫叢集API時啟用資料,請使用 --enable-http-endpoint選項執行 create-db-cluster AWS CLI 命令。

下列範例會在API啟用資料的情況下建立 Aurora PostgreSQL 資料庫叢集。

用於 Linux, macOS,或 Unix:

aws rds create-db-cluster \ --db-cluster-identifier my_pg_cluster \ --engine aurora-postgresql \ --enable-http-endpoint

用於 Windows:

aws rds create-db-cluster ^ --db-cluster-identifier my_pg_cluster ^ --engine aurora-postgresql ^ --enable-http-endpoint

若要在建立 Aurora 資料庫叢集API時啟用資料,請使用 CreateDBCluster 操作,並將 EnableHttpEndpoint 參數的值設定為 true

在現有資料庫API上啟用RDS資料

您可以修改支援RDS資料 API(資料API) 的資料庫叢集,以啟用或停用此功能。

啟用或停用資料 API(Aurora Serverless v2 和 佈建)

使用下列程序啟用或停用 API 上的資料 Aurora Serverless v2 和佈建的資料庫。若要在 API 上啟用或停用資料 Aurora Serverless v1 資料庫,請使用 中的程序啟用或停用資料 API(Aurora Serverless v1 僅限 )

您可以使用支援此功能API之資料庫叢集的RDS主控台來啟用或停用資料。若要這麼做,請開啟您要啟用或停用資料 之資料庫的叢集詳細資訊頁面API,並在連線與安全索引標籤上,前往RDS資料API區段。本節顯示資料 的狀態API,並允許您啟用或停用它。

下列螢幕擷取畫面顯示RDSAPI資料未啟用。

資料庫叢集詳細資訊頁面的連線和安全性索引標籤上的RDS資料API區段。資料的狀態API顯示為已停用,且啟用RDS資料API按鈕存在。

若要啟用或停用現有資料庫API上的資料,請執行 enable-http-endpointdisable-http-endpoint AWS CLI 命令,並指定資料庫叢集ARN的 。

下列範例會啟用資料 API。

用於 Linux, macOS,或 Unix:

aws rds enable-http-endpoint \ --resource-arn cluster_arn

用於 Windows:

aws rds enable-http-endpoint ^ --resource-arn cluster_arn

若要啟用或停用現有資料庫API上的資料,請使用 EnableHttpEndpointDisableHttpEndpoint操作。

啟用或停用資料 API(Aurora Serverless v1 僅限 )

使用下列程序啟用或停用現有 API上的資料 Aurora Serverless v1 資料庫。若要在 API 上啟用或停用資料 Aurora Serverless v2 和 佈建的資料庫,請使用 中的程序啟用或停用資料 API(Aurora Serverless v2 和 佈建)

當您修改 Aurora Serverless v1 資料庫叢集,您可以在RDS主控台的連線區段API中啟用資料。

下列螢幕擷取畫面顯示修改 Aurora 資料庫叢集時啟用的資料API

修改資料庫叢集頁面上的連線區段會選取資料API核取方塊。

如需如何修改 的指示 Aurora Serverless v1 資料庫叢集,請參閱 修改 Aurora Serverless v1 資料庫叢集

若要啟用或停用資料 API,--no-enable-http-endpoint請執行modify-db-cluster AWS CLI 命令,並視情況搭配 --enable-http-endpoint或 執行。

下列範例會啟用 API上的資料sample-cluster

用於 Linux, macOS,或 Unix:

aws rds modify-db-cluster \ --db-cluster-identifier sample-cluster \ --enable-http-endpoint

用於 Windows:

aws rds modify-db-cluster ^ --db-cluster-identifier sample-cluster ^ --enable-http-endpoint

若要啟用資料 API,請使用 ModifyDBCluster 操作,並視需要將 的值設定為 EnableHttpEndpointtruefalse

為RDS資料 API(AWS PrivateLink) 建立 Amazon VPC端點

Amazon VPC可讓您在虛擬私有雲端 (VPC) 中啟動 AWS 資源,例如 Aurora 資料庫叢集和應用程式。 在 VPCsAmazon 網路上 AWS PrivateLink 提供具有高安全性 AWS 的服務與 之間的私有連線。使用 AWS PrivateLink,您可以建立 Amazon VPC端點,讓您以 Amazon VPCs為基礎,跨不同帳戶連線至 服務VPC。如需 的詳細資訊 AWS PrivateLink,請參閱 Amazon Virtual Private Cloud 使用者指南 中的 VPC Endpoint Services (AWS PrivateLink)

您可以使用 Amazon VPC端點呼叫RDS資料 API(資料API)。使用 Amazon VPC端點可保持 Amazon 中的應用程式VPC與 AWS 網路API中的資料之間的流量,而無需使用公有 IP 地址。Amazon VPC端點可協助您符合與限制公有網際網路連線相關的合規和法規要求。例如,如果您使用 Amazon VPC端點,則可以保留在 Amazon EC2執行個體上執行的應用程式與包含它們VPCs的 API中的資料之間的流量。

建立 Amazon VPC端點之後,您可以開始使用它,而不需要在應用程式中進行任何程式碼或組態變更。

為資料建立 Amazon VPC端點 API
  1. 登入 AWS Management Console 並在 開啟 Amazon VPC主控台https://console.aws.amazon.com/vpc/

  2. 選擇 Endpoints (端點),然後選擇 Create Endpoint (建立端點)

  3. Create Endpoint (建立端點) 頁面上,針對 Service category (服務類別) 選擇 AWS services ( 服務)。針對 Service Name (服務名稱),選擇 rds-data

    為 Data 建立 Amazon VPC端點 API
  4. 針對 VPC,選擇 VPC 以建立端點。

    選擇VPC包含進行資料API呼叫之應用程式的 。

  5. 針對子網路 ,選擇執行應用程式之 AWS 服務所使用的每個可用區域 (AZ) 的子網路。

    選擇 Amazon VPC端點的子網路

    若要建立 Amazon VPC端點,請指定端點可存取的私有 IP 地址範圍。若要執行此作業,請選擇每個可用區域的子網路。這樣做會將VPC端點限制為每個可用區域特有的私有 IP 地址範圍,也會在每個可用區域中建立 Amazon VPC端點。

  6. 針對啟用DNS名稱 ,選取為此端點啟用

    啟用 Amazon VPC端點DNS的名稱

    Private 會將標準資料APIDNS主機名稱 (https://rds-data.region.amazonaws.com) DNS解析為與 Amazon VPC端點特定DNS主機名稱相關聯的私有 IP 地址。因此,您可以使用 AWS CLI 或 AWS SDKs 存取資料APIVPC端點,而無需進行任何程式碼或組態變更,以更新資料API端點URL。

  7. 針對安全群組 ,選擇要與 Amazon VPC端點建立關聯的安全群組。

    選擇允許存取正在執行應用程式之 AWS 服務的安全群組。例如,如果 Amazon EC2執行個體正在執行您的應用程式,請選擇允許存取 Amazon EC2執行個體的安全群組。安全群組可讓您從 中的資源控制 Amazon VPC端點的流量VPC。

  8. 針對政策 ,選擇完整存取,以允許 Amazon 內部的任何人API透過此端點VPC存取資料。或者選擇 Custom (自訂),來指定限制存取的政策。

    如果您選擇 Custom (自訂),請在政策建立工具中輸入政策。

  9. 選擇 Create endpoint (建立端點)

建立端點後,請在 中選擇連結 AWS Management Console 以檢視端點詳細資訊。

Amazon VPC端點詳細資訊的連結

端點詳細資訊索引標籤顯示建立 Amazon VPC端點時產生的DNS主機名稱。

Amazon VPC端點詳細資訊的連結

您可以使用標準端點 (rds-data.region.amazonaws.com) 或其中一個 VPC特定端點來呼叫 Amazon API內的資料VPC。標準資料API端點會自動路由至 Amazon VPC端點。此路由的發生原因是建立 Amazon VPC端點時啟用了私有DNS主機名稱。

當您在資料API呼叫中使用 Amazon VPC端點時,應用程式和資料之間的所有流量都會API保留在包含它們VPCs的 Amazon 中。您可以使用 Amazon VPC端點進行任何類型的 Data API Call。如需有關呼叫資料 的資訊API,請參閱 呼叫RDS資料 API

呼叫RDS資料 API

在 Aurora 資料庫叢集上啟用RDS資料 API(資料 API) 的情況下,您可以使用資料API或 在 Aurora 資料庫叢集上執行SQL陳述式 AWS CLI。資料API支援 支援的程式設計語言 AWS SDKs。如需詳細資訊,請參閱要在 上建置的工具 AWS

資料API操作參考

資料API提供下列操作來執行SQL陳述式。

資料API操作

AWS CLI 命令

描述

ExecuteStatement

aws rds-data execute-statement

在資料庫上執行SQL陳述式。

BatchExecuteStatement

aws rds-data batch-execute-statement

在資料陣列上執行批次SQL陳述式,以進行大量更新和插入操作。您可以使用 參數集陣列來執行資料處理語言 (DML) 陳述式。相較於個別插入和更新SQL陳述式,批次陳述式可以提供顯著的效能改善。

您可以使用 操作來執行個別SQL陳述式或執行交易。對於交易,Data API提供下列操作。

資料API操作

AWS CLI 命令

描述

BeginTransaction

aws rds-data begin-transaction

開始SQL交易。

CommitTransaction

aws rds-data commit-transaction

結束SQL交易並遞交變更。

RollbackTransaction

aws rds-data rollback-transaction

執行交易轉返。

執行SQL陳述式和支援交易的操作具有下列常見的資料API參數和 AWS CLI 選項。有些操作支援其他參數或選項。

資料API操作參數

AWS CLI 命令選項

必要

描述

resourceArn

--resource-arn

Aurora 資料庫叢集的 Amazon Resource Name (ARN)。

secretArn

--secret-arn

啟用資料庫叢集存取ARN的秘密名稱或 。

RDS 資料API支援 Aurora My 的下列資料類型SQL:

  • TINYINT(1), BOOLEAN, BOOL

  • TINYINT

  • SMALLINT [SIGNED | UNSIGNED]

  • MEDIUMINT [SIGNED | UNSIGNED]

  • INT [SIGNED | UNSIGNED]

  • BIGINT [SIGNED | UNSIGNED]

  • FLOAT

  • DOUBLE

  • VARCHAR, CHAR, TEXT, ENUM

  • VARBINARY, BINARY, BLOB

  • DATE, TIME, DATETIME, TIMESTAMP

  • DECIMAL

  • JSON

  • BIT, BIT(N)

RDS 資料API支援下列 Aurora PostgreSQL 純量類型:

  • BOOL

  • BYTEA

  • DATE

  • CIDR

  • DECIMAL, NUMERIC

  • ENUM

  • FLOAT8, DOUBLE PRECISION

  • INET

  • INT, INT4, SERIAL

  • INT2, SMALLINT, SMALLSERIAL

  • INT8, BIGINT, BIGSERIAL

  • JSONB, JSON

  • REAL, FLOAT

  • TEXT, CHAR(N), VARCHAR, NAME

  • TIME

  • TIMESTAMP

  • UUID

  • VECTOR

RDS 資料API支援下列 Aurora PostgreSQL 陣列類型:

  • BOOL[], BIT[]

  • DATE[]

  • DECIMAL[], NUMERIC[]

  • FLOAT8[], DOUBLE PRECISION[]

  • INT[], INT4[]

  • INT2[]

  • INT8[], BIGINT[]

  • JSON[]

  • REAL[], FLOAT[]

  • TEXT[], CHAR(N)[], VARCHAR[], NAME[]

  • TIME[]

  • TIMESTAMP[]

  • UUID[]

您可以在對 ExecuteStatement和 進行資料API呼叫BatchExecuteStatement,以及當您執行 AWS CLI 命令execute-statement和 時,使用參數batch-execute-statement。若要使用參數,請在 SqlParameter 資料類型中指定名稱/值對。您使用 Field 資料類型來指定值。下表將 Java Database Connectivity (JDBC) 資料類型對應至您在資料API呼叫中指定的資料類型。

JDBC 資料類型

API 資料類型

INTEGER, TINYINT, SMALLINT, BIGINT

LONG – 、 或 STRING

FLOAT, REAL, DOUBLE

DOUBLE

DECIMAL

STRING

BOOLEAN, BIT

BOOLEAN

BLOB, BINARY, LONGVARBINARY, VARBINARY

BLOB

CLOB

STRING

其他類型 (包含與日期和時間相關的類型)

STRING

注意

您可以在 Data API call 中指定資料庫傳回LONG值的 LONGSTRING資料類型。建議您這樣做,以避免失去非常大數字的精確度,這可能會在您使用 時發生 JavaScript。

某些類型,例如 DECIMALTIME需要提示,以便 Data 將String值API傳遞至資料庫作為正確的類型。若要使用提示,請在 typeHint 資料類型中包含 SqlParameter 的值。typeHint 可能的值如下:

  • DATE – 對應的 String 參數值以 DATE 類型的物件傳送至資料庫。接受的格式為 YYYY-MM-DD

  • DECIMAL – 對應的 String 參數值以 DECIMAL 類型的物件傳送至資料庫。

  • JSON – 對應的 String 參數值以 JSON 類型的物件傳送至資料庫。

  • TIME – 對應的 String 參數值以 TIME 類型的物件傳送至資料庫。接受的格式為 HH:MM:SS[.FFF]

  • TIMESTAMP – 對應的 String 參數值以 TIMESTAMP 類型的物件傳送至資料庫。接受的格式為 YYYY-MM-DD HH:MM:SS[.FFF]

  • UUID – 對應的 String 參數值以 UUID 類型的物件傳送至資料庫。

    注意

    目前,資料API不支援通用唯一識別碼 () 的陣列UUIDs。

注意

對於 Amazon Aurora Postgre SQL,資料API一律會傳回UTC時區TIMESTAMPTZ中的 Aurora PostgreSQL 資料類型。

API 使用 呼叫RDS資料 AWS CLI

您可以使用 呼叫RDS資料 API(資料 API) AWS CLI。

下列範例使用 AWS CLI for Data 的 API。如需詳細資訊,請參閱AWS CLI 資料 的參考API

在每個範例中,將資料庫叢集的 Amazon Resource Name (ARN) 取代為 Aurora 資料庫叢集ARN的 。此外,請將秘密取代ARN為 Secrets Manager 中允許存取資料庫叢集ARN的秘密。

注意

AWS CLI 可以在 中格式化回應JSON。

開始SQL交易

您可以使用 aws rds-data begin-transactionCLI命令啟動SQL交易。此呼叫會傳回交易識別符。

重要

在資料 中API,如果三分鐘內沒有使用其交易 ID 的呼叫,則交易會逾時。如果交易在遞交之前逾時,Data API 會自動將其復原。

交易中的我的SQL資料定義語言 (DDL) 陳述式會導致隱含遞交。建議您使用 --continue-after-timeout選項,在個別execute-statement命令中執行每個 MySQL DDL陳述式。

除了常用選項之外,還將指定 --database 選項,其提供資料庫的名稱。

例如,下列CLI命令會啟動SQL交易。

用於 Linux, macOS,或 Unix:

aws rds-data begin-transaction --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" \ --database "mydb" --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret"

用於 Windows:

aws rds-data begin-transaction --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" ^ --database "mydb" --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret"

以下是回應的範例。

{ "transactionId": "ABC1234567890xyz" }

執行SQL陳述式

您可以使用 aws rds-data execute-statementCLI命令執行SQL陳述式。

您可以使用 --transaction-id選項指定交易識別符,在交易中執行SQL陳述式。您可以使用 aws rds-data begin-transactionCLI命令啟動交易。您可以使用 aws rds-data commit-transactionCLI命令結束和遞交交易。

重要

如果您沒有指定 --transaction-id 選項,系統就會自動遞交呼叫造成的變更。

除了常用的選項,請指定以下選項:

  • --sql (必要) – 在資料庫叢集上執行的SQL陳述式。

  • --transaction-id (選用) – 使用 begin-transactionCLI命令啟動的交易識別碼。指定您要包含SQL陳述式之交易的交易 ID。

  • --parameters (選用) – SQL陳述式的參數。

  • --include-result-metadata | --no-include-result-metadata (選用) – 此值會指出是否在結果中包含中繼資料。預設值為 --no-include-result-metadata

  • --database (選用) – 資料庫的名稱。

    當您在上一個請求--sql "use database_name;"中執行 之後執行SQL陳述式時,--database此選項可能無法運作。建議您使用 --database 選項,而不是執行 --sql "use database_name;" 陳述式。

  • --continue-after-timeout | --no-continue-after-timeout (選用) – 指出是否在呼叫超過 45 秒的資料API逾時間隔後繼續執行陳述式的值。預設值為 --no-continue-after-timeout

    對於資料定義語言 (DDL) 陳述式,我們建議在呼叫逾時後繼續執行陳述式,以避免錯誤和資料結構損毀的可能性。

  • --format-records-as "JSON"|"NONE" – 選擇性值,指定是否要將結果集格式化為JSON字串。預設值為 "NONE"。如需處理JSON結果集的用量資訊,請參閱 以 JSON 格式處理RDS資料API查詢結果

資料庫叢集會傳回呼叫的回應。

注意

回應大小限制為 1 MiB。若呼叫傳回的回應資料超過 1 MiB,系統就會終止呼叫。

用於 Aurora Serverless v1,每秒請求數上限為 1,000。對於所有其他支援的資料庫,沒有限制。

例如,下列CLI命令會執行單一SQL陳述式,並省略結果中的中繼資料 (預設值)。

用於 Linux, macOS,或 Unix:

aws rds-data execute-statement --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" \ --database "mydb" --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret" \ --sql "select * from mytable"

用於 Windows:

aws rds-data execute-statement --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" ^ --database "mydb" --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret" ^ --sql "select * from mytable"

以下是回應的範例。

{ "numberOfRecordsUpdated": 0, "records": [ [ { "longValue": 1 }, { "stringValue": "ValueOne" } ], [ { "longValue": 2 }, { "stringValue": "ValueTwo" } ], [ { "longValue": 3 }, { "stringValue": "ValueThree" } ] ] }

下列CLI命令會透過指定 --transaction-id選項,在交易中執行單一SQL陳述式。

用於 Linux, macOS,或 Unix:

aws rds-data execute-statement --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" \ --database "mydb" --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret" \ --sql "update mytable set quantity=5 where id=201" --transaction-id "ABC1234567890xyz"

用於 Windows:

aws rds-data execute-statement --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" ^ --database "mydb" --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret" ^ --sql "update mytable set quantity=5 where id=201" --transaction-id "ABC1234567890xyz"

以下是回應的範例。

{ "numberOfRecordsUpdated": 1 }

下列CLI命令會使用 參數執行單一SQL陳述式。

用於 Linux, macOS,或 Unix:

aws rds-data execute-statement --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" \ --database "mydb" --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret" \ --sql "insert into mytable values (:id, :val)" --parameters "[{\"name\": \"id\", \"value\": {\"longValue\": 1}},{\"name\": \"val\", \"value\": {\"stringValue\": \"value1\"}}]"

用於 Windows:

aws rds-data execute-statement --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" ^ --database "mydb" --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret" ^ --sql "insert into mytable values (:id, :val)" --parameters "[{\"name\": \"id\", \"value\": {\"longValue\": 1}},{\"name\": \"val\", \"value\": {\"stringValue\": \"value1\"}}]"

以下是回應的範例。

{ "numberOfRecordsUpdated": 1 }

下列CLI命令會執行資料定義語言 (DDL) SQL陳述式。DDL 陳述式會將資料欄重新命名job為資料欄 role

重要

對於DDL陳述式,我們建議您在呼叫逾時後繼續執行陳述式。當DDL陳述式在完成執行之前終止時,可能會導致錯誤和可能損毀的資料結構。若要在呼叫超過 45 秒RDS的資料API逾時間隔後繼續執行陳述式,請指定 --continue-after-timeout選項。

用於 Linux, macOS,或 Unix:

aws rds-data execute-statement --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" \ --database "mydb" --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret" \ --sql "alter table mytable change column job role varchar(100)" --continue-after-timeout

用於 Windows:

aws rds-data execute-statement --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" ^ --database "mydb" --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret" ^ --sql "alter table mytable change column job role varchar(100)" --continue-after-timeout

以下是回應的範例。

{ "generatedFields": [], "numberOfRecordsUpdated": 0 }
注意

Aurora Postgre 不支援generatedFields資料SQL。若要取得所產生欄位的值,請使用 RETURNING 子句。如需詳細資訊,請參閱 PostgreSQL 文件中的從修改的資料列傳回資料

在資料陣列上執行批次SQL陳述式

您可以使用 aws rds-data batch-execute-statementCLI命令,在資料陣列上執行批次SQL陳述式。您可以使用此命令來執行大量匯入或更新操作。

您可以使用 --transaction-id選項指定交易識別符,在交易中執行SQL陳述式。您可以使用 aws rds-data begin-transactionCLI命令啟動交易。您可以使用 aws rds-data commit-transactionCLI命令結束和遞交交易。

重要

如果您沒有指定 --transaction-id 選項,系統就會自動遞交呼叫造成的變更。

除了常用的選項,請指定以下選項:

  • --sql (必要) – 在資料庫叢集上執行的SQL陳述式。

    提示

    對於與 My SQL相容的陳述式,請勿在 --sql 參數結尾包含分號。結尾分號可能會導致語法錯誤。

  • --transaction-id (選用) – 使用 begin-transactionCLI命令啟動的交易識別碼。指定您要包含SQL陳述式之交易的交易 ID。

  • --parameter-set (選用) – 批次操作的參數組。

  • --database (選用) – 資料庫的名稱。

資料庫叢集會傳回呼叫的回應。

注意

參數組數目並無固定上限。不過,透過 Data 提交的HTTP請求大小上限為 API 4 MiB 如果請求超過此限制,資料會API傳回錯誤,且不會處理請求。此 4 MiB 限制包括請求中的HTTP標頭大小和JSON符號。因此,您可以包含的參數集數量取決於多種因素的組合,例如SQL陳述式的大小和每個參數集的大小。

回應大小限制為 1 MiB。若呼叫傳回的回應資料超過 1 MiB,系統就會終止呼叫。

用於 Aurora Serverless v1,每秒請求數上限為 1,000。對於所有其他支援的資料庫,沒有限制。

例如,下列CLI命令會在具有參數集的資料陣列上執行批次SQL陳述式。

用於 Linux, macOS、 或 Unix:

aws rds-data batch-execute-statement --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" \ --database "mydb" --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret" \ --sql "insert into mytable values (:id, :val)" \ --parameter-sets "[[{\"name\": \"id\", \"value\": {\"longValue\": 1}},{\"name\": \"val\", \"value\": {\"stringValue\": \"ValueOne\"}}], [{\"name\": \"id\", \"value\": {\"longValue\": 2}},{\"name\": \"val\", \"value\": {\"stringValue\": \"ValueTwo\"}}], [{\"name\": \"id\", \"value\": {\"longValue\": 3}},{\"name\": \"val\", \"value\": {\"stringValue\": \"ValueThree\"}}]]"

用於 Windows:

aws rds-data batch-execute-statement --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" ^ --database "mydb" --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret" ^ --sql "insert into mytable values (:id, :val)" ^ --parameter-sets "[[{\"name\": \"id\", \"value\": {\"longValue\": 1}},{\"name\": \"val\", \"value\": {\"stringValue\": \"ValueOne\"}}], [{\"name\": \"id\", \"value\": {\"longValue\": 2}},{\"name\": \"val\", \"value\": {\"stringValue\": \"ValueTwo\"}}], [{\"name\": \"id\", \"value\": {\"longValue\": 3}},{\"name\": \"val\", \"value\": {\"stringValue\": \"ValueThree\"}}]]"
注意

請勿在 --parameter-sets 選項中包含分行符號。

委託SQL交易

使用 aws rds-data commit-transactionCLI命令,您可以結束您從 開始SQL的交易aws rds-data begin-transaction並遞交變更。

除了常用的選項,請指定以下選項:

  • --transaction-id (必要) – 使用 begin-transactionCLI命令啟動的交易識別碼。指定您要結束和遞交的交易 ID。

例如,下列CLI命令會結束SQL交易並遞交變更。

用於 Linux, macOS、 或 Unix:

aws rds-data commit-transaction --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" \ --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret" \ --transaction-id "ABC1234567890xyz"

用於 Windows:

aws rds-data commit-transaction --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" ^ --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret" ^ --transaction-id "ABC1234567890xyz"

以下是回應的範例。

{ "transactionStatus": "Transaction Committed" }

復原SQL交易

使用 aws rds-data rollback-transactionCLI命令,您可以復原以 開始SQL的交易aws rds-data begin-transaction。復原交易會取消其變更。

重要

如果交易 ID 已過期,系統會自動復原此交易。在這個情況下,指定此過期交易 ID 的 aws rds-data rollback-transaction 命令會傳回錯誤。

除了常用的選項,請指定以下選項:

  • --transaction-id (必要) – 使用 begin-transactionCLI命令啟動的交易識別碼。指定您要復原的交易 ID。

例如,下列 AWS CLI 命令會復原SQL交易。

用於 Linux, macOS、 或 Unix:

aws rds-data rollback-transaction --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" \ --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret" \ --transaction-id "ABC1234567890xyz"

用於 Windows:

aws rds-data rollback-transaction --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" ^ --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret" ^ --transaction-id "ABC1234567890xyz"

以下是回應的範例。

{ "transactionStatus": "Rollback Complete" }

API 從 Python 應用程式呼叫RDS資料

您可以從 Python 應用程式呼叫RDS資料 API(資料 API)。

下列範例使用 for Python AWS SDK(Boto)。如需 Boto 的詳細資訊,請參閱 AWS SDK for Python (Boto 3) 文件

在每個範例中,將資料庫叢集的 Amazon Resource Name (ARN) 取代為 Aurora 資料庫叢集ARN的 。此外,請將秘密取代ARN為 Secrets Manager 中允許存取資料庫叢集ARN的秘密。

執行SQL查詢

您可以執行 SELECT 陳述式並使用 Python 應用程式擷取結果。

下列範例會執行SQL查詢。

import boto3 rdsData = boto3.client('rds-data') cluster_arn = 'arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster' secret_arn = 'arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret' response1 = rdsData.execute_statement( resourceArn = cluster_arn, secretArn = secret_arn, database = 'mydb', sql = 'select * from employees limit 3') print (response1['records']) [ [ { 'longValue': 1 }, { 'stringValue': 'ROSALEZ' }, { 'stringValue': 'ALEJANDRO' }, { 'stringValue': '2016-02-15 04:34:33.0' } ], [ { 'longValue': 1 }, { 'stringValue': 'DOE' }, { 'stringValue': 'JANE' }, { 'stringValue': '2014-05-09 04:34:33.0' } ], [ { 'longValue': 1 }, { 'stringValue': 'STILES' }, { 'stringValue': 'JOHN' }, { 'stringValue': '2017-09-20 04:34:33.0' } ] ]

執行DMLSQL陳述式

您可以執行資料處理語言 (DML) 陳述式,以插入、更新或刪除資料庫中的資料。您也可以在DML陳述式中使用參數。

重要

如果某個呼叫不包含 transactionID 參數而不屬於某個交易,則系統會自動遞交該呼叫造成的變更。

下列範例會執行插入SQL陳述式並使用參數。

import boto3 cluster_arn = 'arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster' secret_arn = 'arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret' rdsData = boto3.client('rds-data') param1 = {'name':'firstname', 'value':{'stringValue': 'JACKSON'}} param2 = {'name':'lastname', 'value':{'stringValue': 'MATEO'}} paramSet = [param1, param2] response2 = rdsData.execute_statement(resourceArn=cluster_arn, secretArn=secret_arn, database='mydb', sql='insert into employees(first_name, last_name) VALUES(:firstname, :lastname)', parameters = paramSet) print (response2["numberOfRecordsUpdated"])

執行SQL交易

您可以開始SQL交易、執行一或多個SQL陳述式,然後使用 Python 應用程式遞交變更。

重要

如果三分鐘內沒有使用交易 ID 的任何呼叫,交易就會逾時。如果交易在遞交前就逾時,則系統會自動將其復原。

如果您沒有指定交易 ID,系統就會自動遞交呼叫造成的變更。

下列範例會執行將資料列插入資料表SQL的交易。

import boto3 rdsData = boto3.client('rds-data') cluster_arn = 'arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster' secret_arn = 'arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret' tr = rdsData.begin_transaction( resourceArn = cluster_arn, secretArn = secret_arn, database = 'mydb') response3 = rdsData.execute_statement( resourceArn = cluster_arn, secretArn = secret_arn, database = 'mydb', sql = 'insert into employees(first_name, last_name) values('XIULAN', 'WANG')', transactionId = tr['transactionId']) cr = rdsData.commit_transaction( resourceArn = cluster_arn, secretArn = secret_arn, transactionId = tr['transactionId']) cr['transactionStatus'] 'Transaction Committed' response3['numberOfRecordsUpdated'] 1
注意

如果您執行資料定義語言 (DDL) 陳述式,建議您在呼叫逾時後繼續執行陳述式。當DDL陳述式在完成執行之前終止時,可能會導致錯誤和可能損毀的資料結構。若要在呼叫超過 45 秒RDS的資料API逾時間隔後繼續執行陳述式,請將 continueAfterTimeout 參數設定為 true

API 從 Java 應用程式呼叫RDS資料

您可以從 Java 應用程式呼叫RDS資料 API(資料 API)。

下列範例使用適用於 Java 的 AWS SDK 。如需詳細資訊,請參閱《AWS SDK for Java 開發人員指南》

在每個範例中,將資料庫叢集的 Amazon Resource Name (ARN) 取代為 Aurora 資料庫叢集ARN的 。此外,請將秘密取代ARN為 Secrets Manager 中允許存取資料庫叢集ARN的秘密。

執行SQL查詢

您可以執行 SELECT 陳述式並使用 Java 應用程式擷取結果。

下列範例會執行SQL查詢。

package com.amazonaws.rdsdata.examples; import com.amazonaws.services.rdsdata.AWSRDSData; import com.amazonaws.services.rdsdata.AWSRDSDataClient; import com.amazonaws.services.rdsdata.model.ExecuteStatementRequest; import com.amazonaws.services.rdsdata.model.ExecuteStatementResult; import com.amazonaws.services.rdsdata.model.Field; import java.util.List; public class FetchResultsExample { public static final String RESOURCE_ARN = "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster"; public static final String SECRET_ARN = "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret"; public static void main(String[] args) { AWSRDSData rdsData = AWSRDSDataClient.builder().build(); ExecuteStatementRequest request = new ExecuteStatementRequest() .withResourceArn(RESOURCE_ARN) .withSecretArn(SECRET_ARN) .withDatabase("mydb") .withSql("select * from mytable"); ExecuteStatementResult result = rdsData.executeStatement(request); for (List<Field> fields: result.getRecords()) { String stringValue = fields.get(0).getStringValue(); long numberValue = fields.get(1).getLongValue(); System.out.println(String.format("Fetched row: string = %s, number = %d", stringValue, numberValue)); } } }

執行SQL交易

您可以開始SQL交易、執行一或多個SQL陳述式,然後使用 Java 應用程式遞交變更。

重要

如果三分鐘內沒有使用交易 ID 的任何呼叫,交易就會逾時。如果交易在遞交前就逾時,則系統會自動將其復原。

如果您沒有指定交易 ID,系統就會自動遞交呼叫造成的變更。

下列範例會執行SQL交易。

package com.amazonaws.rdsdata.examples; import com.amazonaws.services.rdsdata.AWSRDSData; import com.amazonaws.services.rdsdata.AWSRDSDataClient; import com.amazonaws.services.rdsdata.model.BeginTransactionRequest; import com.amazonaws.services.rdsdata.model.BeginTransactionResult; import com.amazonaws.services.rdsdata.model.CommitTransactionRequest; import com.amazonaws.services.rdsdata.model.ExecuteStatementRequest; public class TransactionExample { public static final String RESOURCE_ARN = "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster"; public static final String SECRET_ARN = "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret"; public static void main(String[] args) { AWSRDSData rdsData = AWSRDSDataClient.builder().build(); BeginTransactionRequest beginTransactionRequest = new BeginTransactionRequest() .withResourceArn(RESOURCE_ARN) .withSecretArn(SECRET_ARN) .withDatabase("mydb"); BeginTransactionResult beginTransactionResult = rdsData.beginTransaction(beginTransactionRequest); String transactionId = beginTransactionResult.getTransactionId(); ExecuteStatementRequest executeStatementRequest = new ExecuteStatementRequest() .withTransactionId(transactionId) .withResourceArn(RESOURCE_ARN) .withSecretArn(SECRET_ARN) .withSql("INSERT INTO test_table VALUES ('hello world!')"); rdsData.executeStatement(executeStatementRequest); CommitTransactionRequest commitTransactionRequest = new CommitTransactionRequest() .withTransactionId(transactionId) .withResourceArn(RESOURCE_ARN) .withSecretArn(SECRET_ARN); rdsData.commitTransaction(commitTransactionRequest); } }
注意

如果您執行資料定義語言 (DDL) 陳述式,建議您在呼叫逾時後繼續執行陳述式。當DDL陳述式在完成執行之前終止時,可能會導致錯誤和可能損毀的資料結構。若要在呼叫超過 45 秒RDS的資料API逾時間隔後繼續執行陳述式,請將 continueAfterTimeout 參數設定為 true

執行批次SQL操作

您可以使用 Java 應用程式,透過資料陣列來執行大量插入和更新操作。您可以使用參數集陣列執行 DML 陳述式。

重要

如果您沒有指定交易 ID,系統就會自動遞交呼叫造成的變更。

以下範例會執行批次插入操作。

package com.amazonaws.rdsdata.examples; import com.amazonaws.services.rdsdata.AWSRDSData; import com.amazonaws.services.rdsdata.AWSRDSDataClient; import com.amazonaws.services.rdsdata.model.BatchExecuteStatementRequest; import com.amazonaws.services.rdsdata.model.Field; import com.amazonaws.services.rdsdata.model.SqlParameter; import java.util.Arrays; public class BatchExecuteExample { public static final String RESOURCE_ARN = "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster"; public static final String SECRET_ARN = "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret"; public static void main(String[] args) { AWSRDSData rdsData = AWSRDSDataClient.builder().build(); BatchExecuteStatementRequest request = new BatchExecuteStatementRequest() .withDatabase("test") .withResourceArn(RESOURCE_ARN) .withSecretArn(SECRET_ARN) .withSql("INSERT INTO test_table2 VALUES (:string, :number)") .withParameterSets(Arrays.asList( Arrays.asList( new SqlParameter().withName("string").withValue(new Field().withStringValue("Hello")), new SqlParameter().withName("number").withValue(new Field().withLongValue(1L)) ), Arrays.asList( new SqlParameter().withName("string").withValue(new Field().withStringValue("World")), new SqlParameter().withName("number").withValue(new Field().withLongValue(2L)) ) )); rdsData.batchExecuteStatement(request); } }

控制資料API逾時行為

對資料的所有呼叫API都是同步的。假設您執行執行 SQL陳述式的資料API操作,例如 INSERTCREATE TABLE。如果資料API呼叫成功傳回,則在呼叫傳回時SQL處理會完成。

根據預設,如果操作未在 45 秒內完成處理,Data 會API取消操作並傳回逾時錯誤。在這種情況下,資料不會插入,資料表也不會建立,依此類推。

您可以使用資料API來執行無法在 45 秒內完成的長期執行操作。如果您預期大量操作INSERT或大型資料表上的DDL操作需要超過 45 秒,您可以指定ExecuteStatement操作的 continueAfterTimeout 參數。您的應用程式仍會收到逾時錯誤。不過,操作會繼續執行,不會取消。如需範例,請參閱執行SQL交易

如果程式設計語言的 AWS SDK具有自己的API呼叫或HTTP通訊端連線逾時期間,請確定所有這些逾時期間都超過 45 秒。對於某些 SDKs,逾時期間預設為少於 45 秒。我們建議將任何 SDK特定或用戶端特定逾時期間設定為至少一分鐘。這樣做可避免應用程式在資料API操作仍然成功完成時收到逾時錯誤的可能性。如此一來,您可以確定是否要重試操作。

例如,假設 SDK會傳回逾時錯誤至您的應用程式,但資料API操作仍會在資料API逾時間隔內完成。在這種情況下,重試操作可能會插入重複的資料,否則會產生不正確的結果。SDK 可能會自動重試操作,導致不正確的資料,而不需要應用程式的任何動作。

逾時間隔對 Java 2 特別重要SDK。在該 中SDK,API通話逾時和HTTP通訊端逾時預設為 30 秒。以下是將這些逾時設定為更高值的範例:

public RdsDataClient createRdsDataClient() { return RdsDataClient.builder() .region(Region.US_EAST_1) // Change this to your desired Region .overrideConfiguration(createOverrideConfiguration()) .httpClientBuilder(createHttpClientBuilder()) .credentialsProvider(defaultCredentialsProvider()) // Change this to your desired credentials provider .build(); } private static ClientOverrideConfiguration createOverrideConfiguration() { return ClientOverrideConfiguration.builder() .apiCallTimeout(Duration.ofSeconds(60)) .build(); } private HttpClientBuilder createHttpClientBuilder() { return ApacheHttpClient.builder() // Change this to your desired HttpClient .socketTimeout(Duration.ofSeconds(60)); }

以下是使用非同步資料用戶端的同等範例:

public static RdsDataAsyncClient createRdsDataAsyncClient() { return RdsDataAsyncClient.builder() .region(Region.US_EAST_1) // Change this to your desired Region .overrideConfiguration(createOverrideConfiguration()) .credentialsProvider(defaultCredentialsProvider()) // Change this to your desired credentials provider .build(); } private static ClientOverrideConfiguration createOverrideConfiguration() { return ClientOverrideConfiguration.builder() .apiCallAttemptTimeout(Duration.ofSeconds(60)) .build(); } private HttpClientBuilder createHttpClientBuilder() { return NettyNioAsyncHttpClient.builder() // Change this to your desired AsyncHttpClient .readTimeout(Duration.ofSeconds(60)); }

針對RDS資料使用 Java 用戶端程式庫 API

您可以下載並使用 Java 用戶端程式庫 for RDS Data API(資料 API)。此 Java 用戶端程式庫提供使用 Data 的替代方法API。使用此程式庫,您可以將用戶端類別對應至資料API請求和回應。此映射支援可以與某些特定的 Java 類型輕鬆整合,例如 DateTimeBigDecimal

下載 Java 用戶端程式庫 for Data API

Data API Java 用戶端程式庫 GitHub 位於下列位置,是 中的開放原始碼:

https://github.com/awslabs/rds-data-api-client-library-java

您可以從原始檔案手動建置程式庫,但最佳實務是使用 Apache Maven 相依性管理來取用程式庫。將下列相依性新增至 Maven POM 檔案。

對於與 AWS SDK 2.x 相容的 2.x 版,請使用下列內容:

<dependency> <groupId>software.amazon.rdsdata</groupId> <artifactId>rds-data-api-client-library-java</artifactId> <version>2.0.0</version> </dependency>

對於與 AWS SDK 1.x 相容的 1.x 版,請使用下列內容:

<dependency> <groupId>software.amazon.rdsdata</groupId> <artifactId>rds-data-api-client-library-java</artifactId> <version>1.0.8</version> </dependency>

Java 用戶端程式庫範例

接下來,您可以找到使用 Data API Java 用戶端程式庫的一些常見範例。這些範例假設您有一個資料表 accounts,而資料表有兩欄:accountIdname。您還有下列資料傳輸物件 (DTO)。

public class Account { int accountId; String name; // getters and setters omitted }

用戶端程式庫可讓您傳遞 DTOs 作為輸入參數。下列範例顯示如何DTOs將客戶對應至輸入參數集。

var account1 = new Account(1, "John"); var account2 = new Account(2, "Mary"); client.forSql("INSERT INTO accounts(accountId, name) VALUES(:accountId, :name)") .withParamSets(account1, account2) .execute();

在某些情況下,以輸入參數處理簡單值比較輕鬆。作法是採用下列語法。

client.forSql("INSERT INTO accounts(accountId, name) VALUES(:accountId, :name)") .withParameter("accountId", 3) .withParameter("name", "Zhang") .execute();

以下是另一個以輸入參數處理簡單值的範例。

client.forSql("INSERT INTO accounts(accountId, name) VALUES(?, ?)", 4, "Carlos") .execute();

傳回結果DTOs時,用戶端程式庫會提供 的自動映射。下列範例顯示結果如何映射至您的 DTOs。

List<Account> result = client.forSql("SELECT * FROM accounts") .execute() .mapToList(Account.class); Account result = client.forSql("SELECT * FROM accounts WHERE account_id = 1") .execute() .mapToSingle(Account.class);

在許多情況下,資料庫結果集只包含單一值。為了簡化擷取此類結果,用戶端程式庫提供下列 API:

int numberOfAccounts = client.forSql("SELECT COUNT(*) FROM accounts") .execute() .singleValue(Integer.class);
注意

mapToList 函數會將SQL結果集轉換為使用者定義的物件清單。我們並不支援在 Java 用戶端程式庫的 ExecuteStatement 呼叫中使用 .withFormatRecordsAs(RecordsFormatType.JSON) 陳述式,因為其具有相同目的。如需詳細資訊,請參閱以 JSON 格式處理RDS資料API查詢結果

以 JSON 格式處理RDS資料API查詢結果

當您呼叫 ExecuteStatement 操作時,您可以選擇讓查詢結果以字串JSON格式傳回。如此一來,您可以使用程式設計語言的JSON剖析功能來解譯和重新格式化結果集。這樣做有助於避免編寫額外的程式碼來對結果集執行迴圈並解讀每個欄值。

若要以 JSON 格式請求結果集,您可以傳遞值為 的選用formatRecordsAs參數JSON。JSON格式化的結果集會在 ExecuteStatementResponse 結構的 formattedRecords 欄位中傳回。

BatchExecuteStatement 動作不會傳回結果集。因此, JSON選項不適用於該動作。

若要自訂JSON雜湊結構中的金鑰,請在結果集中定義資料欄別名。您可以使用SQL查詢資料欄清單中的 AS 子句來執行此操作。

您可以使用 JSON功能,讓結果集更容易讀取,並將其內容映射至語言特定的架構。由於 ASCII編碼結果集的磁碟區大於預設表示法,因此您可以選擇查詢的預設表示法,這些查詢會傳回大量資料列或大量資料欄值,這些值會耗用比應用程式可用的記憶體更多記憶體。

擷取查詢結果JSON格式

若要將結果集作為JSON字串接收,請在ExecuteStatement通話.withFormatRecordsAs(RecordsFormatType.JSON)中包含 。傳回值會傳回為 formattedRecords 欄位中的JSON字串。在本案例中,columnMetadatanull。欄標籤是表示每列物件的鍵。結果集中的每一列都會重複這些欄名。欄值為帶引號的字串、數字值或表示truefalse, 或 null 的特殊值。長度限制和數字和字串的精確類型等資料欄中繼資料不會保留在JSON回應中。

如果省略 .withFormatRecordsAs() 呼叫或指定 NONE 的參數,則結果集將使用 RecordscolumnMetadata 欄位以二進位格式傳回。

資料類型映射

結果集中SQL的值會對應至較小的一組JSON類型。這些值在 中JSON以字串、數字和一些特殊常數表示false,例如 true、 和 null。您可以將這些值轉換為應用程式中的變數,根據您的程式設計語言使用強式或弱式輸入。

JDBC 資料類型

JSON 資料類型

INTEGER, TINYINT, SMALLINT, BIGINT

預設為數字。如果 LongReturnType 選項設定為 STRING 則為字串。

FLOAT, REAL, DOUBLE

Number

DECIMAL

預設為字串。如果 DecimalReturnType 選項設定為 DOUBLE_OR_LONG 則為數字。

STRING

字串

BOOLEAN, BIT

Boolean

BLOB, BINARY, VARBINARY, LONGVARBINARY

base64 編碼的字串。

CLOB

字串

ARRAY

陣列

NULL

null

其他類型 (包含與日期和時間相關的類型)

字串

故障診斷

JSON 回應限制為 10 MB。若回應大於此限制,您的程式會收到 BadRequestException 錯誤。於此狀況下,您可使用下列其中一種方法解決此錯誤:

  • 減少結果集中的列數量。若要執行此作業,請新增 LIMIT 子句。您可使用 LIMITOFFSET 子句提交多個查詢,將一個較大結果集分割為多個較小的結果集。

    如果結果集包含按應用程式邏輯過濾掉的列,則可以透過在 WHERE 子句中新增更多條件來從結果集中移除這些列。

  • 減少結果集中的欄數量。若要執行此作業,請從查詢的選取清單中移除項目。

  • 在查詢中使用欄別名,來縮短欄標籤。結果集中每一列的每個資料欄名稱都會在JSON字串中重複。因此,具有冗長欄名稱和許多列的查詢結果,可能會超出大小限制。特別是,針對複雜表達式使用資料欄別名,以避免在JSON字串中重複整個表達式。

  • 雖然SQL您可以使用 資料欄別名產生具有相同名稱的多個資料欄的結果集,但 不允許重複的金鑰名稱JSON。如果您以 JSON 格式請求結果集,且多個資料欄具有相同的名稱,則RDS資料會API傳回錯誤。因此,請確保所有欄標籤都具有唯一的名稱。

範例

下列 Java 範例示範如何使用 ExecuteStatement 回應作為JSON格式化字串呼叫,然後解譯結果集。取代 的適當值 databaseName, secretStoreArnclusterArn 參數。

以下 Java 範例示範了在結果集中傳回十進位數值的查詢。assertThat 呼叫會根據JSON結果集的規則,測試回應欄位是否具有預期的屬性。

此範例適用於以下結構描述和範例資料:

create table test_simplified_json (a float); insert into test_simplified_json values(10.0);
public void JSON_result_set_demo() { var sql = "select * from test_simplified_json"; var request = new ExecuteStatementRequest() .withDatabase(databaseName) .withSecretArn(secretStoreArn) .withResourceArn(clusterArn) .withSql(sql) .withFormatRecordsAs(RecordsFormatType.JSON); var result = rdsdataClient.executeStatement(request); }

前面程式中 formattedRecords 欄位的值為:

[{"a":10.0}]

回應中的 RecordsColumnMetadata 欄位都是 null,因為結果JSON集存在。

以下 Java 範例示範了在結果集中傳回整數值的查詢。此範例getFormattedRecords會呼叫 僅傳回 JSON格式化字串,並忽略空白或 null 的其他回應欄位。範例會將結果還原序列化為表示記錄清單的結構。每個記錄都具有其名稱對應於結果集中的欄別名的欄位。此技術簡化了用於剖析結果集的程式碼。您的應用程式不必循環對結果集的列和欄執行迴圈,以及將每個值轉換為適當的類型。

此範例適用於以下結構描述和範例資料:

create table test_simplified_json (a int); insert into test_simplified_json values(17);
public void JSON_deserialization_demo() { var sql = "select * from test_simplified_json"; var request = new ExecuteStatementRequest() .withDatabase(databaseName) .withSecretArn(secretStoreArn) .withResourceArn(clusterArn) .withSql(sql) .withFormatRecordsAs(RecordsFormatType.JSON); var result = rdsdataClient.executeStatement(request) .getFormattedRecords(); /* Turn the result set into a Java object, a list of records. Each record has a field 'a' corresponding to the column labelled 'a' in the result set. */ private static class Record { public int a; } var recordsList = new ObjectMapper().readValue( response, new TypeReference<List<Record>>() { }); }

前面程式中 formattedRecords 欄位的值為:

[{"a":17}]

若要擷取結果列 0 的 a 欄,則應用程式將參考 recordsList.get(0).a

相反地,下列 Java 範例顯示當您不使用 JSON 格式時,建構保留結果集的資料結構所需的程式碼類型。在這種情況下,結果集的每一列都包含單一使用者相關資訊的欄位。建置表示結果集的資料結構需要在所有列中執行迴圈。對於每一列,程式碼會擷取每個欄位的值、執行適當的類型轉換,並將結果指派給代表列之物件中的相應欄位。然後,程式碼將代表每個使用者的物件新增到表示整個結果集的資料結構中。如果查詢變更為對結果集中的欄位進行重新排序、新增或移除,則應用程式的程式碼也必須變更。

/* Verbose result-parsing code that doesn't use the JSON result set format */ for (var row: response.getRecords()) { var user = User.builder() .userId(row.get(0).getLongValue()) .firstName(row.get(1).getStringValue()) .lastName(row.get(2).getStringValue()) .dob(Instant.parse(row.get(3).getStringValue())) .build(); result.add(user); }

下面的範例值顯示了具有不同欄數、欄別名和欄資料類型之結果集的 formattedRecords 欄位。

如果結果集包含多列,則每一列會表示為陣列元素的物件。結果集中的每一欄都將成為物件中的鍵。結果集中的每一列都會重複這些鍵。因此,對於包含許多列和欄的結果集,您可能需要定義簡短的欄別名,以避免超出整個回應的長度限制。

此範例適用於以下結構描述和範例資料:

create table sample_names (id int, name varchar(128)); insert into sample_names values (0, "Jane"), (1, "Mohan"), (2, "Maria"), (3, "Bruce"), (4, "Jasmine");
[{"id":0,"name":"Jane"},{"id":1,"name":"Mohan"}, {"id":2,"name":"Maria"},{"id":3,"name":"Bruce"},{"id":4,"name":"Jasmine"}]

如果將結果集中的資料欄定義為表達式,表達式的文字就會成為JSON索引鍵。因此,在查詢的選取清單中為每個表達式定義描述性欄別名通常很方便。例如,以下查詢在其選取清單中包括函數呼叫和算術運算等表達式。

select count(*), max(id), 4+7 from sample_names;

這些表達式會傳遞至JSON結果集作為索引鍵。

[{"count(*)":5,"max(id)":4,"4+7":11}]

使用描述性標籤新增AS資料欄可讓索引鍵更輕鬆地在JSON結果集中解譯。

select count(*) as rows, max(id) as largest_id, 4+7 as addition_result from sample_names;

透過修訂的SQL查詢,子AS句定義的資料欄標籤會用作金鑰名稱。

[{"rows":5,"largest_id":4,"addition_result":11}]

JSON 字串中每個鍵值對的值可以是引號字串。字串可能包含 Unicode 字元。如果字串包含逸出序列或 "\ 字元,則這些字元前面會有反斜線逸出字元。下列JSON字串範例示範了這些可能性。例如,string_with_escape_sequences 結果包含特殊字元退格、換行字元、歸位字元、tab 鍵、表單摘要和 \

[{"quoted_string":"hello"}] [{"unicode_string":"邓不利多"}] [{"string_with_escape_sequences":"\b \n \r \t \f \\ '"}]

JSON 字串中每個鍵值對的值也可以代表數字。數字可以是整數、浮點值、負值或以指數表示法表示的值。下列JSON字串範例示範了這些可能性。

[{"integer_value":17}] [{"float_value":10.0}] [{"negative_value":-9223372036854775808,"positive_value":9223372036854775807}] [{"very_small_floating_point_value":4.9E-324,"very_large_floating_point_value":1.7976931348623157E308}]

布林值和 null 值用未加引號的特殊關鍵字 truefalse 以及 null 來表示。下列JSON字串範例示範了這些可能性。

[{"boolean_value_1":true,"boolean_value_2":false}] [{"unknown_value":null}]

如果您選擇BLOB類型值,結果會在JSON字串中以 base64 編碼值表示。若要將值轉換回原始表示法,您可以使用應用程式語言中的適當解碼函數。例如,在 Java 中,您可以呼叫函數 Base64.getDecoder().decode()。下列範例輸出顯示選取 BLOB值並將結果集hello world傳回為JSON字串的結果。

[{"blob_column":"aGVsbG8gd29ybGQ="}]

以下 Python 範例示範如何從呼叫 Python execute_statement 函數的結果中存取值。結果集是欄位 response['formattedRecords'] 中的字串值。程式碼會呼叫 json.loads函數,將JSON字串轉換為資料結構。然後,結果集的每一列都是資料結構中的一個清單元素,而在每一列中,您可以按名稱參考結果集的每個欄位。

import json result = json.loads(response['formattedRecords']) print (result[0]["id"])

下列 JavaScript 範例顯示如何從呼叫 JavaScript executeStatement函數的結果存取值。結果集是欄位 response.formattedRecords 中的字串值。程式碼會呼叫 JSON.parse函數,將JSON字串轉換為資料結構。然後,結果集的每一列都是資料結構中的一個陣列元素,而在每一列中,您可以按名稱參考結果集的每個欄位。

<script> const result = JSON.parse(response.formattedRecords); document.getElementById("display").innerHTML = result[0].id; </script>

對RDS資料API問題進行故障診斷

使用下列標題為常見錯誤訊息的章節,協助您疑難排解RDS資料 API(資料) 的問題API。

找不到交易 <transaction_ID>

在此情況下,找不到資料API呼叫中指定的交易 ID。此問題的原因已附加至錯誤訊息中,且是下列其中一項:

  • Transaction may be expired (交易可能已過期)。

    請確認每個交易呼叫都是在前一個呼叫後的三分鐘內執行。

    指定的交易 ID 也可能不是由BeginTransaction呼叫建立。請確認您的呼叫具有效的交易 ID。

  • One previous call resulted in a termination of your transaction (之前的一次呼叫導致您的交易終止)。

    該交易已由您的 CommitTransactionRollbackTransaction 呼叫終止。

  • Transaction has been aborted due to an error from a previous call (由於前次呼叫的錯誤,交易已中止)。

    檢查您之前的呼叫是否發生任何異常。

如需執行交易的資訊,請參閱 呼叫RDS資料 API

查詢封包過大

在這種情況下,表示為資料列傳回的結果集過大。資料庫傳回的結果集中,資料API大小限制為每列 64 KB。

若要解決此問題,請確定結果集的每個資料列都是 64 KB 或更小。

資料庫回應超過大小上限

在這種情況下,表示資料庫傳回結果集的大小過大。資料庫傳回的結果集中的資料API限制為 1 MiB。

若要解決此問題,請確定呼叫資料API傳回 1 MiB 或更少的資料。若您需要傳回超過 1 MiB,您可以在查詢中搭配 LIMIT 子句使用多個 ExecuteStatement 呼叫。

如需有關LIMIT子句的詳細資訊,請參閱我的SQL文件中的SELECT語法

HttpEndpoint 未針對叢集 <cluster_ID> 啟用

檢查此問題的下列潛在原因:

  • Aurora 資料庫叢集不支援資料 API。如需有關 RDS Data API支援的資料庫叢集類型的資訊,請參閱 區域和版本可用性

  • Aurora 資料庫叢集API未啟用資料。若要將資料API與 Aurora 資料庫叢集搭配使用,API必須為資料庫叢集啟用資料。如需啟用資料 的資訊API,請參閱 啟用RDS資料 API

  • 資料庫叢集在API啟用資料之後重新命名。在這種情況下,請關閉API該叢集的資料,然後再次啟用它。

  • ARN 您指定的 與叢集ARN的 不完全相符。檢查從其他來源ARN傳回或由程式邏輯建構的 是否完全符合叢集ARN的 。例如,請確定ARN您使用的 具有所有字母字元的正確字母大小寫。