使用 RDS 資料 API - Amazon Aurora

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

使用 RDS 資料 API

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

使用者不需要透過呼叫傳遞認證至 Data API,因為 Data API 使用儲存在中的資料庫認證 AWS Secrets Manager。若要將認證儲存在 Secrets Manager 中,使用者必須獲得適當的權限,才能使用機 Secrets Manager,以及資料 API。如需授權使用者的詳細資訊,請參閱授權 RDS 資料應用程式介面的存取

您也可以使用資料 API 將 Amazon Aurora 與其他 AWS 應用程式 (例如 AWS Lambda AWS AppSync、和) 整合 AWS Cloud9。資料 API 提供更安全的使用方式 AWS Lambda。這可讓您存取資料庫叢集,而不需將 Lambda 函數設定為在 Virtual Private Cloud (VPC) 存取資源。如需詳細資訊,請參閱AWS LambdaAWS AppSyncAWS Cloud9

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

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

區域和版本可用性

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

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

Aurora PostgreSQL 和無伺服器 v2

使用 Aurora 無伺服 PostgreSQL 和已佈建的資料 API

Aurora 无伺服器

使用 Aurora 無伺服器 V1 的資料 API

Aurora 無伺服器

使用 Aurora MySQL 無伺服器 V1 的資料 API

注意

目前,資料 API 不適用於 Aurora MySQL 佈建或無伺服器 v2 資料庫叢集。

如果您在透過命令列介面或 API 存取資料 API 時需要經過 FIPS 140-2 驗證的密碼編譯模組,請使用 FIPS 端點。如需有關 FIPS 和 FIPS 端點的更多相關資訊,請參閱聯邦資訊處理標準 (FIPS) 140-2 概觀

RDS 資料 API 的限制

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

  • 您只能對資料庫叢集中的寫入器執行個體執行資料 API 查詢。但是,作家實例可以接受寫入和讀取查詢。

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

  • Performance Insights 不支援您使用資料 API 進行的監視資料庫查詢。

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

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

  • 對於 Aurora 版本 14 及更高版本的數據庫,數據 API 僅支持用於密碼加密的數據庫。

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

下表說明 RDS 資料 API (資料 API) 與 Aurora PostgreSQL 無伺服器 v2、佈建的資料庫叢集,以及資料庫叢集之間的差異。Aurora Serverless v1

差異 Aurora 無 PostgreSQL 器 V2 和已佈建 Aurora Serverless v1
每秒要求的最大數目 無限制 1,000
使用 RDS API 或在現有資料庫上啟用或停用資料 API AWS CLI
  • RDS API — 使用EnableHttpEndpointDisableHttpEndpoint作業。

  • AWS CLI — 使用enable-http-endpointdisable-http-endpoint作業。

  • RDS API — 使用ModifyDBCluster作業,並指定EnableHttpEndpoint參數的truefalse (如果適用)。

  • 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 PostgreSQL,多重陳述式只會傳回第一個查詢回應。對於 Aurora MySQL,不支援多重陳述式。
BatchExecute聲明 更新結果中生成的字段對象是空的。 更新結果中產生的欄位物件包含插入的值。
执行 SQL 不支援 已棄用
ExecuteStatement

ExecuteStatement不支持檢索多維數組列。在這種情況下,數據 API 拋出UnsupportedResultException

資料 API 不支援某些資料類型,例如幾何和貨幣類型。在這種情況下,數據 API 拋出UnsupportedResultException: The result contains the unsupported data type data_type

僅支援下列類型:

  • 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

僅支援下列陣列類型:

  • 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支持檢索多維數組列和所有高級數據類型。

授權 RDS 資料應用程式介面的存取

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

AmazonRDSDataFullAccess策略還包括用戶從中獲取密碼值的權限 AWS Secrets Manager。使用者必須使用 Secrets Manager 來儲存可在呼叫資料 API 時使用的密碼。使用密碼表示使用者不需要在呼叫 Data API 時包含其目標資源的資料庫認證。資料 API 會透明地呼叫 Secrets Manager,允許 (或拒絕) 使用者提出密碼要求。如需有關設定密碼以搭配資料 API 使用的資訊,請參閱將資料庫認證儲存於 AWS Secrets Manager

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

例如,下列原則顯示使用者存取其 ARN 所識別之資料庫叢集之 Data API 所需的最低權限範例。該政策包括存取 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 資料 API (資料 API) 和 Secrets Manager 都支援以標籤為基礎的授權。標籤是用來標示資源 (例如 RDS 叢集) 的索引鍵值配對,並具有額外的字串值,例如:

  • environment:production

  • environment:development

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

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

套用政策的方式如下:使用者使用 Data 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" ] } } } ] }

此範例顯示資料 API rds-datasecretsmanager機 Secrets Manager 的和個別動作。但是,您可以合併動作並以許多不同的方式定義標籤條件,以支援您的特定使用案例。如需詳細資訊,請參閱針對 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. 使用 Secret 管理員主控台來檢視您建立之密碼的詳細資料,或執行aws secretsmanager describe-secret AWS CLI 命令。

    記下秘密的名稱和 ARN。您可以在呼叫資料 API 時使用它們。

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

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

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

啟用 RDS 資料 API

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

注意

對於 Aurora PostgreSQL,資料 API 支援Aurora Serverless v2Aurora Serverless v1、和佈建的資料庫。對於 Aurora MySQL,資料 API 僅支援資料Aurora Serverless v1庫。

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

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

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

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

如需如何建立資料庫的指示,請參閱下列內容:

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

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

對於LinuxmacOS、或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

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

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

啟用或停用資料 API (Aurora PostgreSQL 無伺服器 v2 和已佈建)

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

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

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

資料庫叢集詳細資料頁面之 [連線和安全性] 索引標籤上的 [RDS 資料 API] 區段。資料 API 的狀態會顯示為已停用,而且會出現 [啟用 RDS 資料 API] 按鈕。

若要在現有資料庫上啟用或停用資料 API,請執行啟用 http-端點/ 用 http-端點 AWS CLI 命令,然後指定資料庫叢集的 ARN。

下列範例會啟用資料 API。

對於LinuxmacOS、或Unix:

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

在 Windows 中:

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

若要在現有資料庫上啟用或停用 Data API,請使用「EnableHttp端點」和「DisableHttp端點」作業。

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

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

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

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

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

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

若要啟用或停用資料 API,請使用或 (如果適用) 執行修改-db 叢集 AWS CLI 命令。--enable-http-endpoint --no-enable-http-endpoint

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

對於LinuxmacOS、或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 作業,並EnableHttpEndpoint將的值設定為truefalse (如果適用)。

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

Amazon VPC 可讓您將 Aurora AWS 資料庫叢集和應用程式等資源啟動到虛擬私有雲端 (VPC)。 AWS PrivateLink 在 Amazon 網路上以高安全性提供 VPC 和 AWS 服務之間的私有連線。您可以使用 AWS PrivateLink此方式建立 Amazon VPC 端點,讓您能夠以 Amazon VPC 為基礎,跨不同帳戶和 VPC 連線到服務。如需 AWS PrivateLink的相關資訊,請參閱《Amazon Virtual Private Cloud 使用者指南》中的 VPC 端點服務 (AWS PrivateLink)

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

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

若要為資料 API 建立 Amazon VPC 人雲端端點
  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

    為資料 API 建立 Amazon VPC 人雲端端點
  4. 針對 VPC,選擇要在其中建立端點的 VPC。

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

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

    為 Amazon VPC 端點選擇子網路

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

  6. 針對 Enable DNS name (啟用 DNS 名稱),選取 Enable for this endpoint (為此端點啟用)

    啟用 Amazon VPC 端點的 DNS 名稱

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

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

    選擇允許存取執行應用程式之 AWS 服務的安全性群組。舉例來說,若有 Amazon EC2 執行個體在執行您的應用程式,請選擇要允許存取 Amazon EC2 執行個體的安全群組。安全群組能讓您控制 VPC 中,資源流向 Amazon VPC 端點的流量。

  8. 針對 Policy (政策),請選擇 Full Access (完整存取) 讓 Amazon VPC 中的所有人都能透過此端點存取資料 API。或者選擇 Custom (自訂),來指定限制存取的政策。

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

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

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

Amazon VPC 端點詳細資訊的連結

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

Amazon VPC 端點詳細資訊的連結

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

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

呼叫 RDS 資料 API

在 Aurora 資料庫叢集上啟用 RDS 資料 API (資料 API) 後,您可以使用資料 API 或 AWS CLI. 資料 API 支援 AWS SDK 支援的程式設計語言。如需詳細資訊,請參閱建置基礎的工具 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 陳述式或執行交易。對於交易,數據 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 資源名稱 (ARN)。

secretArn

--secret-arn

用來允許存取資料庫叢集之秘密的名稱或 ARN。

您可以在 Data API 呼叫ExecuteStatement和中使用參數BatchExecuteStatement,以及執行 AWS CLI 命令execute-statementbatch-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

注意

您可以在 LONG 資料 API 呼叫中,針對資料庫傳回的 STRING 值指定 LONG 或資料類型。我們建議您這樣做,以避免失去極大數字的精確度,這可能會在您使用時發生這種情況 JavaScript。

某些類型(例如DECIMAL和)需要提示TIME,以便 Data API 將String值作為正確類型傳遞給數據庫。若要使用提示,請在 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 不支援通用唯一識別碼 (UUID) 的陣列。

注意

對於 Amazon Aurora PostgreSQL,資料 API 一律以世界標準時TIMESTAMPTZ區傳回 Aurora PostgreSQL 資料類型。

呼叫 RDS 資料 API 與 AWS CLI

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

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

在每個範例中,將資料庫叢集的 Amazon 資源名稱 (ARN) 取代為 Aurora 資料庫叢集的 ARN。同時也將秘密 ARN 取代為 Secrets Manager 中允許存取資料庫叢集的秘密 ARN。

注意

AWS CLI 可以將回應格式化為 JSON 格式。

開始 SQL 交易

您可以使用 aws rds-data begin-transaction CLI 命令來開始 SQL 交易。此呼叫會傳回交易識別符。

重要

在 Data API 中,如果在三分鐘內沒有呼叫使用其交易 ID,則交易逾時。如果交易在認可之前逾時,Data API 會自動回復交易。

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

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

例如,以下 CLI 命令會開始 SQL 交易。

對於LinuxmacOS、或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-statement CLI 命令來執行 SQL 陳述式。

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

重要

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

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

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

  • --transaction-id (選用) – 使用 begin-transaction CLI 命令開始的交易識別符。指定您要在其中包含 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(選用) — 指出在呼叫超過資料 API 逾時間隔 45 秒後是否繼續執行陳述式的值。預設值為 --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 陳述式並省略結果中的中繼資料 (預設值)。

對於LinuxmacOS、或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 陳述式。

對於LinuxmacOS、或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 陳述式。

對於LinuxmacOS、或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 陳述式在完成執行前而終止時,可能會發生錯誤且資料結構可能毀損。若要在呼叫超過 RDS Data API 逾時間隔 45 秒後繼續執行陳述式,請指定--continue-after-timeout選項。

對於LinuxmacOS、或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 PostgreSQL 不支援 generatedFields 資料。若要取得所產生欄位的值,請使用 RETURNING 子句。如需詳細資訊,請參閱 PostgreSQL 中的從修改後的資料列傳回資料

透過資料陣列來執行批次 SQL 陳述式

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

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

重要

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

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

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

    提示

    對於 MySQL 相容的陳述句,請不要在 --sql 參數結尾包含分號。結尾分號可能會導致語法錯誤。

  • --transaction-id (選用) – 使用 begin-transaction CLI 命令開始的交易識別符。指定您要在其中包含 SQL 陳述式的交易 ID。

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

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

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

注意

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

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

對於Aurora Serverless v1,每秒的要求數目上限為 1,000。對於所有其他支持的數據庫,沒有限制。

例如,以下 CLI 命令會透過含參數組的資料陣列來執行批次 SQL 陳述式。

對於LinuxmacOS、或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-transaction CLI 命令,來結束您透過 aws rds-data begin-transaction 開始的 SQL 交易和遞交變更。

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

  • --transaction-id (必要) – 使用 begin-transaction CLI 命令開始的交易識別符。指定您要結束和遞交的交易 ID。

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

對於LinuxmacOS、或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-transaction CLI 命令,來復原您透過 aws rds-data begin-transaction 開始的 SQL 交易。復原交易會取消其變更。

重要

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

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

  • --transaction-id (必要) – 使用 begin-transaction CLI 命令開始的交易識別符。指定您要復原的交易 ID。

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

對於LinuxmacOS、或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" }

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

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

下面的實例使用 AWS SDK 的 Python(博托)。如需 Boto 的更多詳細資訊,請參閱適用於 Python 的AWS 開發套件 (Boto 3) 文件

在每個範例中,將資料庫叢集的 Amazon 資源名稱 (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' } ] ]

執行 DML SQL 陳述式

您可以執行資料處理語言 (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 陳述式在完成執行前而終止時,可能會發生錯誤且資料結構可能毀損。若要在呼叫超過 RDS Data API 逾時間隔 45 秒後繼續執行陳述式,請將continueAfterTimeout參數設定為true

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

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

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

在每個範例中,將資料庫叢集的 Amazon 資源名稱 (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 陳述式在完成執行前而終止時,可能會發生錯誤且資料結構可能毀損。若要在呼叫超過 RDS Data API 逾時間隔 45 秒後繼續執行陳述式,請將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 的所有呼叫都是同步的。假設您執行的資料 API 作業會執行 SQL 陳述式,例如INSERTCREATE TABLE。如果資料 API 呼叫成功傳回,則會在呼叫傳回時完成 SQL 處理。

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

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

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

例如,假設 SDK 向您的應用程式傳回逾時錯誤,但資料 API 作業仍在 Data 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 資料 API 的 Java 用戶端程式庫

您可以下載並使用適用於 RDS 數據 API(數據 API)的 Java 客戶端庫。這個 Java 客戶端庫提供了一種使用數據 API 的替代方法。使用此程式庫,您可以將用戶端類別對應至 Data API 要求和回應。此映射支援可以與某些特定的 Java 類型輕鬆整合,例如 DateTimeBigDecimal

下載適用於資料 API 的 Java 用戶端程式庫

Java 客戶端庫的數據 API 在 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 用戶端程式庫範例

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

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

用戶端程式可讓您以輸入參數傳遞 DTO。下列範例顯示客戶 DTO 如何映射至輸入參數集。

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();

用戶端程式庫可以在結果傳回時自動映射至 DTO。下列範例顯示結果如何映射至 DTO。

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 字串形式接收結果集,請包含.withFormatRecordsAs(RecordsFormatType.JSON)ExecuteStatement呼叫中。傳回值會以 formattedRecords 欄位中的 JSON 字串傳回。在本案例中,columnMetadatanull。欄標籤是表示每列物件的鍵。結果集中的每一列都會重複這些欄名。欄值為帶引號的字串、數字值或表示truefalse, 或 null 的特殊值。欄中繼資料 (如長度限制以及數字和字串的精確類型) 不會保留在 JSON 回應中。

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

資料類型映射

結果集中的 SQL 值映射至一組較小的 JSON 類型。這些值在 JSON 中表示為字串、數字和一些特殊的常數,例如 truefalse,和 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 Data API 會傳回錯誤。因此,請確保所有欄標籤都具有唯一的名稱。

範例

以下 Java 範例示範如何呼叫 ExecuteStatement 並搭配 JSON 格式字串的回應,然後解讀結果集。以適當的值取代「資料庫名稱」、「密碼 StoreArn」和「叢集參數」參數。

以下 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 子句的詳細資訊,請參閱 MySQL 文件中的 SELECT 語法

HttpEndpoint未啟用叢集 <cluster_ID>

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

  • Aurora 資料庫叢集不支援資料 API。例如,對於 Aurora MySQL,您只能使用Aurora Serverless v1. 如需 RDS 資料 API 支援之資料庫叢集類型的相關資訊,請參閱區域和版本可用性

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

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

  • 您指定的 ARN 未精確地符合叢集的 ARN。檢查從其他來源傳回的 ARN 或由程序邏輯建置的 ARN 是否完全符合叢集的 ARN。例如,請確保您使用的 ARN 對於所有字母字元具有正確的字母大小寫。