Node.js 用 Amazon QLDBドライバー — クイックスタートチュートリアル - Amazon Quantum 台帳データベース (Amazon QLDB)

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Node.js 用 Amazon QLDBドライバー — クイックスタートチュートリアル

重要

サポート終了通知: 既存のお客様は、07/31/2025 のサポート終了QLDBまで Amazon を使用できます。詳細については、「Amazon Ledger QLDB を Amazon Aurora Postgre に移行するSQL」を参照してください。

このチュートリアルでは、Node.js 用の Amazon QLDBドライバーを使用してシンプルなアプリケーションを設定する方法について説明します。このガイドには、ドライバーのインストール手順と、基本的な作成、読み取り、更新、削除 (CRUD) オペレーションの短い例と JavaScript TypeScript コード例が含まれています。これらのオペレーションを完全なサンプルアプリケーションで実行する詳細な例については、「Node.js チュートリアル」を参照してください。

注記

該当する場合、一部のステップでは、サポートされている Node.js 用QLDBドライバーのメジャーバージョンごとに異なるコード例があります。

前提条件

作業を始める前に、次の操作を実行してください。

  1. Node.js ドライバー用の「前提条件」を完了します (まだ完了していない場合)。これには、 へのサインアップ AWS、開発用のプログラムによるアクセスの付与、Node.js のインストールが含まれます。

  2. quick-start という名前の台帳を作成します。

    台帳の作成方法については、「Amazon QLDB台帳の基本オペレーション」、または「コンソールの開始方法」の「ステップ 1: 新しい台帳を作成する」を参照してください。

を使用している場合は TypeScript、以下のセットアップ手順も実行する必要があります。

をインストールするには TypeScript
  1. TypeScript パッケージをインストールします。QLDB ドライバーは TypeScript 3.8.x で実行されます。

    $ npm install --global typescript@3.8.0
  2. パッケージをインストールしたら、次のコマンドを実行して、 TypeScript コンパイラがインストールされていることを確認します。

    $ tsc --version

次の手順でコードを実行するには、まず TypeScript 次のようにファイルを実行可能 JavaScript コードにトランスパイルする必要があることに注意してください。

$ tsc app.ts; node app.js

ステップ 1: プロジェクトを設定する

まず、Node.js プロジェクトを設定します。

  1. アプリケーション用のフォルダを作成します。

    $ mkdir myproject $ cd myproject
  2. プロジェクトを初期化するには、次の npm コマンドを入力し、設定中に表示される質問に回答します。ほとんどの質問にはデフォルトを使用できます。

    $ npm init
  3. Node.js 用の Amazon QLDBドライバーをインストールします。

    • バージョン 3.x の使用

      $ npm install amazon-qldb-driver-nodejs --save
    • バージョン 2.x の使用

      $ npm install amazon-qldb-driver-nodejs@2.2.0 --save
    • バージョン 1.x の使用

      $ npm install amazon-qldb-driver-nodejs@1.0.0 --save
  4. ドライバーのピア依存関係をインストールします。

    • バージョン 3.x の使用

      $ npm install @aws-sdk/client-qldb-session --save $ npm install ion-js --save $ npm install jsbi --save
    • バージョン 2.x または 1.x の使用

      $ npm install aws-sdk --save $ npm install ion-js@4.0.0 --save $ npm install jsbi@3.1.1 --save
  5. に JavaScript、 app.jsに という名前の新しいファイルapp.tsを作成します TypeScript。

    次に、次のステップのコード例を段階的に追加して、いくつかの基本的なCRUDオペレーションを試します。または、 step-by-step チュートリアルをスキップして、代わりに完全なアプリケーション を実行することもできます。

ステップ 2: ドライバーを初期化する

quick-start という名前の台帳に接続するドライバーのインスタンスを初期化します。次のコードを app.js または app.ts ファイルに追加します。

JavaScript
var qldb = require('amazon-qldb-driver-nodejs'); var https = require('https'); function main() { const maxConcurrentTransactions = 10; const retryLimit = 4; const agentForQldb = new https.Agent({ maxSockets: maxConcurrentTransactions }); const lowLevelClientHttpOptions = { httpAgent: agentForQldb } const serviceConfigurationOptions = { region: "us-east-1" }; // Use driver's default backoff function for this example (no second parameter provided to RetryConfig) var retryConfig = new qldb.RetryConfig(retryLimit); var driver = new qldb.QldbDriver("quick-start", serviceConfigurationOptions, lowlevelClientHttpOptions, maxConcurrentTransactions, retryConfig); } main();
TypeScript
import { Agent } from "https"; import { NodeHttpHandlerOptions } from "@aws-sdk/node-http-handler"; import { QLDBSessionClientConfig } from "@aws-sdk/client-qldb-session"; import { QldbDriver, RetryConfig } from "amazon-qldb-driver-nodejs"; function main(): void { const maxConcurrentTransactions: number = 10; const agentForQldb: Agent = new Agent({ maxSockets: maxConcurrentTransactions }); const lowLevelClientHttpOptions: NodeHttpHandlerOptions = { httpAgent: agentForQldb }; const serviceConfigurationOptions: QLDBSessionClientConfig = { region: "us-east-1" }; const retryLimit: number = 4; // Use driver's default backoff function for this example (no second parameter provided to RetryConfig) const retryConfig: RetryConfig = new RetryConfig(retryLimit); const driver: QldbDriver = new QldbDriver("quick-start", serviceConfigurationOptions, lowLevelClientHttpOptions, maxConcurrentTransactions, retryConfig); } if (require.main === module) { main(); }
注記
  • このコード例では、us-east-1 台帳を作成した AWS リージョン を使用します。

  • 簡単にするために、このガイドの残りのコード例では、次のバージョン 1.x の例で指定しているように、デフォルト設定のドライバーを使用しています。その代わりに、RetryConfig をカスタマイズすることで、独自のドライバーインスタンスを使用することもできます。

JavaScript
var qldb = require('amazon-qldb-driver-nodejs'); var https = require('https'); function main() { var maxConcurrentTransactions = 10; var retryLimit = 4; var agentForQldb = new https.Agent({ keepAlive: true, maxSockets: maxConcurrentTransactions }); var serviceConfigurationOptions = { region: "us-east-1", httpOptions: { agent: agentForQldb } }; // Use driver's default backoff function for this example (no second parameter provided to RetryConfig) var retryConfig = new qldb.RetryConfig(retryLimit); var driver = new qldb.QldbDriver("quick-start", serviceConfigurationOptions, maxConcurrentTransactions, retryConfig); } main();
TypeScript
import { QldbDriver, RetryConfig } from "amazon-qldb-driver-nodejs"; import { ClientConfiguration } from "aws-sdk/clients/acm"; import { Agent } from "https"; function main(): void { const maxConcurrentTransactions: number = 10; const agentForQldb: Agent = new Agent({ keepAlive: true, maxSockets: maxConcurrentTransactions }); const serviceConfigurationOptions: ClientConfiguration = { region: "us-east-1", httpOptions: { agent: agentForQldb } }; const retryLimit: number = 4; // Use driver's default backoff function for this example (no second parameter provided to RetryConfig) const retryConfig: RetryConfig = new RetryConfig(retryLimit); const driver: QldbDriver = new QldbDriver("quick-start", serviceConfigurationOptions, maxConcurrentTransactions, retryConfig); } if (require.main === module) { main(); }
注記
  • このコード例では、us-east-1 台帳を作成した AWS リージョン を使用します。

  • バージョン 2.x には QldbDriver を初期化する RetryConfig という新しいオプションパラメータが導入されています。

  • 簡単にするために、このガイドの残りのコード例では、次のバージョン 1.x の例で指定しているように、デフォルト設定のドライバーを使用しています。その代わりに、RetryConfig をカスタマイズすることで、独自のドライバーインスタンスを使用することもできます。

  • このコード例では、Keep-Alive オプションを設定して、既存の接続を再利用するドライバーを初期化します。詳細については、Node.js ドライバー向けの「セットアップの推奨事項」を参照してください。

JavaScript
const qldb = require('amazon-qldb-driver-nodejs'); function main() { // Use default settings const driver = new qldb.QldbDriver("quick-start"); } main();
TypeScript
import { QldbDriver } from "amazon-qldb-driver-nodejs"; function main(): void { // Use default settings const driver: QldbDriver = new QldbDriver("quick-start"); } if (require.main === module) { main(); }
注記

AWS_REGION 環境変数を設定して、リージョンを指定できます。詳細については、「AWS SDK for JavaScript デベロッパーガイド」の「AWS リージョンの設定」を参照してください。

ステップ 3: テーブルとインデックスを作成する

次のコード例は、CREATE TABLE ステートメントと CREATE INDEX ステートメントの実行方法を示しています。

  1. 次の関数を追加して People という名前のテーブルを作成します。

    JavaScript
    async function createTable(txn) { await txn.execute("CREATE TABLE People"); }
    TypeScript
    async function createTable(txn: TransactionExecutor): Promise<void> { await txn.execute("CREATE TABLE People"); }
  2. People テーブルの firstName フィールドのインデックスを作成する、以下の関数を追加します。インデックスは、クエリのパフォーマンスを最適化し、オプティミスティック同時実行制御 (OCC) の競合例外を制限するのに役立ちます。

    JavaScript
    async function createIndex(txn) { await txn.execute("CREATE INDEX ON People (firstName)"); }
    TypeScript
    async function createIndex(txn: TransactionExecutor): Promise<void> { await txn.execute("CREATE INDEX ON People (firstName)"); }
  3. main 関数で最初に createTable を呼び出し、次に createIndex を呼び出します。

    JavaScript
    const qldb = require('amazon-qldb-driver-nodejs'); async function main() { // Use default settings const driver = new qldb.QldbDriver("quick-start"); await driver.executeLambda(async (txn) => { console.log("Create table People"); await createTable(txn); console.log("Create index on firstName"); await createIndex(txn); }); driver.close(); } main();
    TypeScript
    import { QldbDriver, TransactionExecutor } from "amazon-qldb-driver-nodejs"; async function main(): Promise<void> { // Use default settings const driver: QldbDriver = new QldbDriver("quick-start"); await driver.executeLambda(async (txn: TransactionExecutor) => { console.log("Create table People"); await createTable(txn); console.log("Create index on firstName"); await createIndex(txn); }); driver.close(); } if (require.main === module) { main(); }
  4. コードを実行して、テーブルとインデックスを作成します。

    JavaScript
    $ node app.js
    TypeScript
    $ tsc app.ts; node app.js

ステップ 4: ドキュメントを挿入する

次のコード例は、INSERT ステートメントの実行方法を示しています。QLDB は、PartiQLクエリ言語 (SQL互換) と Amazon Ion データ形式 ( のスーパーセット) をサポートしていますJSON。

  1. 次の関数を追加して People テーブルにドキュメントを挿入します。

    JavaScript
    async function insertDocument(txn) { const person = { firstName: "John", lastName: "Doe", age: 42 }; await txn.execute("INSERT INTO People ?", person); }
    TypeScript
    async function insertDocument(txn: TransactionExecutor): Promise<void> { const person: Record<string, any> = { firstName: "John", lastName: "Doe", age: 42 }; await txn.execute("INSERT INTO People ?", person); }

    この例では、疑問符 (?) を変数プレースホルダーとして使用して、ドキュメント情報をステートメントに渡します。execute メソッドは、Amazon Ion 型と Node.js ネイティブ型の両方の値をサポートします。

    ヒント

    1 つの INSERT ステートメントを使用して複数のドキュメントを挿入するために、次のように型 list のパラメータをステートメントに渡すことができます。

    // people is a list txn.execute("INSERT INTO People ?", people);

    リストを渡すときには、変数プレースホルダー (?) を二重山括弧 (<<...>>) で囲まないでください。マニュアルの PartiQL ステートメントでは、二重山括弧はバッグと呼ばれる順序付けされていないコレクションを表します。

  2. main 関数で、createTablecreateIndex の呼び出しを削除し、insertDocument への呼び出しを追加します。

    JavaScript
    const qldb = require('amazon-qldb-driver-nodejs'); async function main() { // Use default settings const driver = new qldb.QldbDriver("quick-start"); await driver.executeLambda(async (txn) => { console.log("Insert document"); await insertDocument(txn); }); driver.close(); } main();
    TypeScript
    import { QldbDriver, TransactionExecutor } from "amazon-qldb-driver-nodejs"; async function main(): Promise<void> { // Use default settings const driver: QldbDriver = new QldbDriver("quick-start"); await driver.executeLambda(async (txn: TransactionExecutor) => { console.log("Insert document"); await insertDocument(txn); }); driver.close(); } if (require.main === module) { main(); }

ステップ 5: ドキュメントにクエリを実行する

次のコード例は、SELECT ステートメントの実行方法を示しています。

  1. 次の関数を追加して People テーブルのドキュメントにクエリを実行します。

    JavaScript
    async function fetchDocuments(txn) { return await txn.execute("SELECT firstName, age, lastName FROM People WHERE firstName = ?", "John"); }
    TypeScript
    async function fetchDocuments(txn: TransactionExecutor): Promise<dom.Value[]> { return (await txn.execute("SELECT firstName, age, lastName FROM People WHERE firstName = ?", "John")).getResultList(); }
  2. main 関数で、次の fetchDocuments への呼び出しを、insertDocument への呼び出しの後に追加します。

    JavaScript
    const qldb = require('amazon-qldb-driver-nodejs'); async function main() { // Use default settings const driver = new qldb.QldbDriver("quick-start"); var resultList = await driver.executeLambda(async (txn) => { console.log("Insert document"); await insertDocument(txn); console.log("Fetch document"); var result = await fetchDocuments(txn); return result.getResultList(); }); // Pretty print the result list console.log("The result List is ", JSON.stringify(resultList, null, 2)); driver.close(); } main();
    TypeScript
    import { QldbDriver, TransactionExecutor } from "amazon-qldb-driver-nodejs"; import { dom } from "ion-js"; async function main(): Promise<void> { // Use default settings const driver: QldbDriver = new QldbDriver("quick-start"); const resultList: dom.Value[] = await driver.executeLambda(async (txn: TransactionExecutor) => { console.log("Insert document"); await insertDocument(txn); console.log("Fetch document"); return await fetchDocuments(txn); }); // Pretty print the result list console.log("The result List is ", JSON.stringify(resultList, null, 2)); driver.close(); } if (require.main === module) { main(); }

ステップ 6: ドキュメントを更新する

次のコード例は、UPDATE ステートメントの実行方法を示しています。

  1. 次の関数を追加し、lastName"Stiles" に変更して People テーブルのドキュメントを更新します。

    JavaScript
    async function updateDocuments(txn) { await txn.execute("UPDATE People SET lastName = ? WHERE firstName = ?", "Stiles", "John"); }
    TypeScript
    async function updateDocuments(txn: TransactionExecutor): Promise<void> { await txn.execute("UPDATE People SET lastName = ? WHERE firstName = ?", "Stiles", "John"); }
  2. main 関数で、次の updateDocuments への呼び出しを、fetchDocuments への呼び出しの後に追加します。次に、fetchDocuments を再度呼び出して、更新された結果を確認します。

    JavaScript
    const qldb = require('amazon-qldb-driver-nodejs'); async function main() { // Use default settings const driver = new qldb.QldbDriver("quick-start"); var resultList = await driver.executeLambda(async (txn) => { console.log("Insert document"); await insertDocument(txn); console.log("Fetch document"); await fetchDocuments(txn); console.log("Update document"); await updateDocuments(txn); console.log("Fetch document after update"); var result = await fetchDocuments(txn); return result.getResultList(); }); // Pretty print the result list console.log("The result List is ", JSON.stringify(resultList, null, 2)); driver.close(); } main();
    TypeScript
    import { QldbDriver, TransactionExecutor } from "amazon-qldb-driver-nodejs"; import { dom } from "ion-js"; async function main(): Promise<void> { // Use default settings const driver: QldbDriver = new QldbDriver("quick-start"); const resultList: dom.Value[] = await driver.executeLambda(async (txn: TransactionExecutor) => { console.log("Insert document"); await insertDocument(txn); console.log("Fetch document"); await fetchDocuments(txn); console.log("Update document"); await updateDocuments(txn); console.log("Fetch document after update"); return await fetchDocuments(txn); }); // Pretty print the result list console.log("The result List is ", JSON.stringify(resultList, null, 2)); driver.close(); } if (require.main === module) { main(); }
  3. コードを実行して、ドキュメントの挿入、クエリ、更新を行います。

    JavaScript
    $ node app.js
    TypeScript
    $ tsc app.ts; node app.js

完全なアプリケーションの実行

次のコード例は、app.jsapp.ts の完全なバージョンを示しています。上のステップを個別に実行する代わりに、このコードを最初から最後まで実行することもできます。このアプリケーションは、 という名前の台帳に対するいくつかの基本的なCRUDオペレーションを示していますquick-start

注記

このコードを実行する前に、quick-start 台帳に People という名前のアクティブなテーブルが存在しないことを確認してください。

JavaScript
const qldb = require('amazon-qldb-driver-nodejs'); async function createTable(txn) { await txn.execute("CREATE TABLE People"); } async function createIndex(txn) { await txn.execute("CREATE INDEX ON People (firstName)"); } async function insertDocument(txn) { const person = { firstName: "John", lastName: "Doe", age: 42 }; await txn.execute("INSERT INTO People ?", person); } async function fetchDocuments(txn) { return await txn.execute("SELECT firstName, age, lastName FROM People WHERE firstName = ?", "John"); } async function updateDocuments(txn) { await txn.execute("UPDATE People SET lastName = ? WHERE firstName = ?", "Stiles", "John"); } async function main() { // Use default settings const driver = new qldb.QldbDriver("quick-start"); var resultList = await driver.executeLambda(async (txn) => { console.log("Create table People"); await createTable(txn); console.log("Create index on firstName"); await createIndex(txn); console.log("Insert document"); await insertDocument(txn); console.log("Fetch document"); await fetchDocuments(txn); console.log("Update document"); await updateDocuments(txn); console.log("Fetch document after update"); var result = await fetchDocuments(txn); return result.getResultList(); }); // Pretty print the result list console.log("The result List is ", JSON.stringify(resultList, null, 2)); driver.close(); } main();
TypeScript
import { QldbDriver, TransactionExecutor } from "amazon-qldb-driver-nodejs"; import { dom } from "ion-js"; async function createTable(txn: TransactionExecutor): Promise<void> { await txn.execute("CREATE TABLE People"); } async function createIndex(txn: TransactionExecutor): Promise<void> { await txn.execute("CREATE INDEX ON People (firstName)"); } async function insertDocument(txn: TransactionExecutor): Promise<void> { const person: Record<string, any> = { firstName: "John", lastName: "Doe", age: 42 }; await txn.execute("INSERT INTO People ?", person); } async function fetchDocuments(txn: TransactionExecutor): Promise<dom.Value[]> { return (await txn.execute("SELECT firstName, age, lastName FROM People WHERE firstName = ?", "John")).getResultList(); } async function updateDocuments(txn: TransactionExecutor): Promise<void> { await txn.execute("UPDATE People SET lastName = ? WHERE firstName = ?", "Stiles", "John"); }; async function main(): Promise<void> { // Use default settings const driver: QldbDriver = new QldbDriver("quick-start"); const resultList: dom.Value[] = await driver.executeLambda(async (txn: TransactionExecutor) => { console.log("Create table People"); await createTable(txn); console.log("Create index on firstName"); await createIndex(txn); console.log("Insert document"); await insertDocument(txn); console.log("Fetch document"); await fetchDocuments(txn); console.log("Update document"); await updateDocuments(txn); console.log("Fetch document after update"); return await fetchDocuments(txn); }); // Pretty print the result list console.log("The result List is ", JSON.stringify(resultList, null, 2)); driver.close(); } if (require.main === module) { main(); }

完全なアプリケーションを実行するには、次のコマンドを入力します。

JavaScript
$ node app.js
TypeScript
$ tsc app.ts; node app.js