APIを使用したOracle NoSQL Database Cloud Serviceでの表および索引の作成

Java、Python、Go、Node.jsまたはから表および索引を作成する方法について学習します。NETアプリケーション。

この記事には次のトピックが含まれます:

Oracle NoSQL Database SDKドライバについて

Oracle NoSQL Database SDKドライバについて学習します。

Oracle NoSQL Database SDKドライバには、オンプレミスまたはOracle NoSQL Database Cloud ServiceまたはOracle NoSQL Database Cloud Simulatorと対話できるファイルが含まれています。

Oracle NoSQL Database SDK for JavaはMaven Centralリポジトリで使用でき、詳細はここから入手可能です。プロジェクトの主要な場所は GitHubです。

SDKを実行するために必要なすべてのファイルを、次のPOMファイルの依存関係で取得できます。
ノート

リリースごとにバージョンが変更されます。
<dependency>
  <groupId>com.oracle.nosql.sdk</groupId>
  <artifactId>nosqldriver</artifactId>
  <version>5.2.31</version>
</dependency>

Oracle NoSQL Database SDK for Javaは、すべてのJavaクラス、メソッド、インタフェースおよび例を提供します。ドキュメントは、GitHubまたはJava APIリファレンス・ガイドでjavadocとして使用できます。

次に示すコマンドを使用して、Python Package Indexを通じてPython SDKをインストールできます。

pip3 install borneo

Oracle NoSQL SDK for Pythonは、すべてのPythonクラス、メソッド、インタフェースおよび例を提供します。ドキュメントは、Python APIリファレンス・ガイドで入手できます。

ブラウザで「ダウンロードの実行」ページを開き、オペレーティング・システムに対応するダウンロード・タブをクリックします。ファイルをホーム・フォルダに保存します。

「Go」をオペレーティング・システムにインストールします。
  • Windowsシステムでは、ダウンロードしたMSIファイルを開き、プロンプトに従ってGoをインストールします。
  • Linuxシステムでは、ダウンロードしたアーカイブを/usr/localに抽出して、/usr/local/goにGoツリーを作成します。PATH環境変数に/usr/local/go/binを追加します。

SDKの使用方法およびGoドライバのパッケージ、タイプおよびメソッドを参照するには、オンライン・ゴーカにアクセスします。

Node.jsダウンロードからNode.js 12.0.0以上のバージョンをダウンロードしてインストールします。Node Package Manager (npm)がNode.jsとともにインストールされていることを確認します。次に示すように、ノードSDK for Oracle NoSQL Databaseをインストールします。
npm install oracle-nosqldb

Node.jsクラス、イベントおよびグローバル・オブジェクトを参照するには、Node.js APIリファレンス・ガイドにアクセスします。

NuGet Package ManagerからSDKをインストールするには、プロジェクトへの参照として追加するか、または独立して追加します。
  • SDKをプロジェクト・リファレンスとして追加:を使用して、SDKのNuGetパッケージをプロジェクトへの参照として追加できます。Net CLI。
    cd <your-project-directory>
    dotnet add package Oracle.NoSQL.SDK
    または、Visual StudioのNuGet Package Managerを使用して同じ操作を実行できます。
  • Independent Install: nuget.exe CLIを使用して、選択したディレクトリにSDKを個別にインストールできます。
    nuget.exe install Oracle.NoSQL.SDK -OutputDirectory
    <your-packages-directory>

NoSQLハンドルの取得

Oracle NoSQL Databaseドライバを使用して表にアクセスする方法を学習します。NoSQLハンドルを作成することにより、アプリケーションの開発を開始します。NoSQLHandleを使用して表にアクセスし、すべての操作を実行します。

NoSQLHandleで表される接続を作成するには、NoSQLHandleFactory.createNoSQLHandleメソッドとNoSQLHandleConfigクラスを使用してハンドルを取得します。NoSQLHandleConfigクラスを使用すると、アプリケーションでハンドル構成を指定できます。詳細は、Java APIリファレンス・ガイドを参照してください。

NoSQLハンドルを取得するには、次のコードを使用します:
/* Configure a handle for the desired Region and AuthorizationProvider.
 * By default this SignatureProvider constructor reads authorization
 * information from ~/.oci/config and uses the default user profile and
 * private key for request signing. Additional SignatureProvider
 * constructors are available if a config file is not available or
 * desirable. 
 */
AuthorizationProvider ap = new SignatureProvider();

/* Use the us-ashburn-1 region */
NoSQLHandleConfig config = new NoSQLHandleConfig(Region.US_ASHBURN_1, ap);
config.setAuthorizationProvider(ap);

/* Sets a default compartment for all requests from this handle. This 
 * may be overridden in individual requests or by using a
 * compartment-name prefixed table name.
 */
config.setDefaultCompartment("mycompartment");

// Open the handle
NoSQLHandle handle = NoSQLHandleFactory.createNoSQLHandle(config);

// Use the handle to execute operations

ハンドルには、メモリーとネットワーク・リソースが関連付けられています。ハンドルを使用してアプリケーションを完了するときには、NoSQLHandle.closeメソッドを使用してリソースを解放する必要があります。

ネットワーク・アクティビティおよびリソースの割当てと割当て解除のオーバーヘッドを最小限に抑えるために、ハンドルを繰り返し作成してクローズすることは避けるのが賢明です。たとえば、操作のたびにハンドルを作成してクローズすると、アプリケーションのパフォーマンスが低下します。1つのハンドルで同時操作が許可されているため、マルチスレッド・アプリケーションで表にアクセスするには、1つハンドルがあれば十分です。複数のハンドルを作成すると、余分なリソース・オーバーヘッドが生じ、パフォーマンス上のメリットがなくなります。

ハンドルは、最初に通信エンドポイント、認可情報およびハンドル構成のデフォルト値を構成するborneo.NoSQLHandleConfigインスタンスを作成することによって作成されます。borneo.NoSQLHandleConfigは、サービスへの接続を表します。作成後は、リソースをクリーンアップするために、メソッドborneo.NoSQLHandle.close()を使用してクローズする必要があります。ハンドルはスレッドセーフで、共有することを目的としています。

Oracle NoSQL Cloud ServiceのNoSQLハンドルを取得する例:
from borneo import NoSQLHandle, NoSQLHandleConfig, Regions
from borneo.iam import SignatureProvider
# create AuthorizationProvider
provider = SignatureProvider()
# create handle config using the correct desired region
# as endpoint, add a default compartment.
config = NoSQLHandleConfig(Regions.US_ASHBURN_1).
set_authorization_provider(provider).
set_default_compartment('mycompartment')
# create the handle
handle = NoSQLHandle(config)
ノート

ハンドル作成のリソース使用率およびオーバーヘッドを削減するには、borneo.NoSQLHandleインスタンスの作成とクローズを過度に行わないことをお薦めします。
Oracle NoSQL Database Cloud Serviceのgoアプリケーションの最初のステップは、サービスにリクエストを送信するために使用するnosqldb.Clientハンドルを作成することです。クライアント・ハンドルのインスタンスは、複数のゴルチンによる同時使用で安全であり、マルチ・ゴルーチン・アプリケーションで共有することを目的としています。ハンドルは、資格証明およびその他の認証情報を使用して構成されます。
provider, err := iam.NewSignatureProviderFromFile(cfgfile, profile, passphrase, compartment)
cfg := nosqldb.Config
{ 
   Region: "us-phoenix-1", AuthorizationProvider: provider,
}
client, err := nosqldb.NewClient(cfg)
// use client for all NoSQL DB operations

クラスNoSQLClientは、サービスへの主要なアクセス・ポイントを表します。NoSQLClientのインスタンスを作成するには、適切な構成情報を指定する必要があります。この情報はプレーンJavaScriptオブジェクトで表され、オブジェクト・リテラルとしてNoSQLClientコンストラクタに提供できます。または、この情報をJSON構成ファイルおよびNoSQLClientコンストラクタに格納し、そのファイルへのパス(アプリケーションの現在のディレクトリに対する絶対パスまたは相対パス)を指定することもできます。

次の例では、構成オブジェクト・リテラルを使用して、Cloud ServiceのNoSQLClientのインスタンスを作成します。また、デフォルト・コンパートメントが追加され、構成オブジェクトの一部のデフォルトのタイムアウト値がオーバーライドされます。
const NoSQLClient = require('oracle-nosqldb').NoSQLClient;

let client = new NoSQLClient({
    region: Region.US_ASHBURN_1,
    timeout: 20000,
    ddlTimeout: 40000,
    compartment: 'mycompartment',
    auth: {
        iam: {
            configFile: '~/myapp/.oci/config',
            profileName: 'Jane'
        }
    }
});

2番目の例では、同じ構成をJSONファイルconfig.jsonに格納し、それを使用してNoSQLClientインスタンスを作成します。

サンプルconfig.jsonファイル:
{ 
"region": "US_ASHBURN_1",
 "timeout": 20000,
 "ddlTimeout": 40000,
 "compartment": "mycompartment", 
 "auth": { 
    "iam": { 
       "configFile": "~/myapp/.oci/config",
       "profileName": "Jane"
    } 
  }
}
アプリケーション・コード:
const NoSQLClient = require('oracle-nosqldb').NoSQLClient;
let client = new NoSQLClient('config.json');

クラスNoSQLClientは、サービスへの主要なアクセス・ポイントを表します。NoSQLClientのインスタンスを作成するには、適切な構成情報を指定する必要があります。この情報は、NoSQLClientコンストラクタにインスタンスを提供できるNoSQLConfigクラスで表されます。または、構成情報をJSON構成ファイルに格納し、そのファイルへのパス(絶対または現在のディレクトリに対する相対)を取得するNoSQLClientコンストラクタを使用することもできます。

次の例では、NoSQLConfigを使用して、Cloud ServiceのNoSQLClientのインスタンスを作成します。また、デフォルトのコンパートメントが追加され、NoSQLConfigのデフォルトのタイムアウト値がオーバーライドされます。
var client = new NoSQLClient(
    new NoSQLConfig
    {
        Region = Region.US_ASHBURN_1,
        Timeout = TimeSpan.FromSeconds(10),
        TableDDLTimeout = TimeSpan.FromSeconds(20),
        Compartment = "mycompartment",
        AuthorizationProvider = new IAMAuthorizationProvider(
            "~/myapp/.oci/config", "Jane")
    });

2番目の例では、同じ構成をJSONファイルconfig.jsonに格納し、それを使用してNoSQLClientインスタンスを作成します。

config.json
{
    "Region": "us-ashburn-1",
    "Timeout": 20000,
    "TableDDLTimeout": 40000,
    "compartment": "mycompartment",
    "AuthorizationProvider":
    {
        "AuthorizationType": "IAM",
        "ConfigFile": "~/myapp/.oci/config",
        "ProfileName": "Jane"
    }
}
アプリケーション・コード:
var client = new NoSQLClient("config.json");

コンパートメントについて

Oracle NoSQL Databaseドライバを使用してOracle NoSQL Database Cloud Service表の作成および操作中にコンパートメントを指定する方法について学習します。

Oracle NoSQL Database Cloud Service表はコンパートメントに作成され、そのコンパートメントにスコープ指定されます。特定のユーザーとして認証されると、特に指定がないかぎり、表はテナンシのルート・コンパートメントで管理されます。表を様々なコンパートメントに編成すると、組織およびセキュリティに対して役立ちます。

インスタンス・プリンシパル(OCIコンピュート・インスタンスからサービスにアクセス)を使用して認証されている場合、この場合のデフォルトは存在しないため、ID (OCID)を使用してコンパートメントを指定する必要があります。Oracle Cloud Infrastructureドキュメンテーションインスタンスからのサービスのコールを参照してください。

アプリケーション・コードにコンパートメントを指定する方法はいくつかあります:
  1. ハンドルを使用するすべての操作に適用されるように、NoSQLHandleConfigでデフォルトのコンパートメントを使用します。例は、NoSQLハンドルの取得を参照してください。
  2. 各リクエストでは、表名に加えて、コンパートメント名またはID (OCID)を使用します。これにより、デフォルトのコンパートメントがオーバーライドされます。
    例:
    GetRequest getReq = new GetRequest().setTableName("mytable")
                                        .setCompartment("mycompartment");
  3. 表名の接頭辞としてコンパートメント名を使用します。これにより、デフォルトのコンパートメントや、APIを使用して指定されたコンパートメントがオーバーライドされます。
    例:
    GetRequest getReq = new GetRequest().setTableName("mycompartment:mytable");
名前付きコンパートメントを使用している場合、名前には最上位コンパートメントの単純名またはネストされたコンパートメントへのパスを指定できます。後者の場合、パスは"." (ドット)区切りのパスです。
ノート

ネストされたコンパートメントへのパスを指定する際には、テナンシから推測されるため、最上位コンパートメントの名前をパスに含めないでください。
アプリケーション・コードにコンパートメントを指定する方法はいくつかあります:
  • borneo.NoSQLHandleConfig.set_compartment()のリクエストのデフォルト・コンパートメントの指定を許可するメソッドが存在します。これにより、ユーザーのデフォルトのコンパートメントがオーバーライドされます。
  • また、各Requestインスタンスにコンパートメントを指定できます。
set_compartmentメソッドは、ID (OCID)またはコンパートメント名またはパスのいずれかを取ります。コンパートメント名が使用されている場合、最上位コンパートメントの名前になることがあります。
ノート

コンパートメント・パスを使用してネストされたコンパートメントを参照する場合、パスは、パスの最上位レベルのコンパートメント(compartmentA.compartmentBなど)を除外するドット区切りパスです。
リクエストにコンパートメントを設定するかわりに、コンパートメント名を使用して、リクエスト、問合せまたはDDL文で表名の接頭辞を付けることができます。この使用は、コンパートメントの他の設定より優先されます。例:
...
request = PutRequest().set_table_name('mycompartment:mytable')
...
create_statement = 'create table mycompartment:mytable(...)' 
...
request = GetRequest().set_table_name('compartmentA.compartmentB')
アプリケーション・コードにコンパートメントを指定する方法はいくつかあります:
  • 目的のコンパートメント名またはIDを設定できます。
  • デフォルトのコンパートメント(テナンシのルート・コンパートメント)を使用するには、空の文字列に設定します。
  • ネストされたコンパートメントを使用する場合は、ルート・コンパートメントに対する相対的な完全なコンパートメント・パスをcompartmentIDとして指定します。たとえば、rootCompartment.compartmentA.compartmentBを使用する場合は、compartmentIDをcompartmentA.compartmentBに設定する必要があります。
  • コンパートメントOCIDを文字列値として使用することもできます。
compartmentID:="<optional-compartment-name-or-ID>"
iam.NewRawSignatureProvider(tenancy, user, region, fingerprint, compartmentID,
        privateKey, &privateKeyPassphrase)
表のデフォルト・コンパートメントは、ユーザーのテナンシのルート・コンパートメントです。すべての操作のデフォルト・コンパートメントを指定するには、NoSQLConfigのコンパートメント・プロパティを設定します。例:
const NoSQLClient = require('oracle-nosqldb').NoSQLClient;
const client = new NoSQLClient({
    region: Region.US_ASHBURN_1,
    compartment: 'mycompartment'
});

文字列値は、コンパートメントID、コンパートメント名またはパスのいずれかです。単純な名前の場合は、トップレベルのコンパートメントを指定する必要があります。ネストされたコンパートメントへのパスである場合、最上位コンパートメントはテナンシから推測されるため、除外する必要があります。コンパートメントは、optionsオブジェクトの各リクエストで指定することもできます。この値は、初期構成値をオーバーライドします。

コンパートメントを指定しない場合、テナンシOCIDがデフォルトとして使用されます。これは、ユーザーのアイデンティティで認可する場合にのみ適用されます。インスタンス・プリンシパルまたはリソース・プリンシパルを使用する場合は、コンパートメントIDを指定する必要があります。

表のデフォルト・コンパートメントは、ユーザーのテナンシのルート・コンパートメントです。すべての操作のデフォルト・コンパートメントを指定するには、NoSQLConfigのコンパートメント・プロパティを設定します。例:
var client = new NoSQLClient(
    new NoSQLConfig
    {
        Region=Region.US_ASHBURN_1,
        Compartment="<compartment_ocid_or_name>"
    });
文字列値は、コンパートメントOCID、コンパートメント名またはパスのいずれかです。単純な名前の場合は、トップレベルのコンパートメントを指定する必要があります。ネストされたコンパートメントへのパスである場合、最上位コンパートメントはテナンシから推測されるため、除外する必要があります。

また、すべての操作オプション・クラスには、TableDDLOptions.CompartmentGetOptions.CompartmentPutOptions.CompartmentなどのCompartmentプロパティがあります。したがって、どの操作でも比較を個別に指定することもできます。この値は、設定されている場合、NoSQLConfigのコンパートメント値をオーバーライドします(ある場合)。

コンパートメントを指定しない場合、テナンシOCIDがデフォルトとして使用されます。これは、ユーザーのアイデンティティで認可する場合にのみ適用されます。インスタンス・プリンシパルまたはリソース・プリンシパルを使用する場合は、コンパートメントIDを指定する必要があります。

表および索引の作成

表および索引を作成する方法について学習します。

表の作成は、アプリケーション開発の最初のステップです。

APIクラスおよびメソッドを使用して、表の作成、変更および削除などのすべてのDDL文を実行します。APIメソッドを使用して、表の制限を設定することもできます。

表を作成する前に、次を参照してください:

DDL文の例:

/* Create a new table called users */
CREATE TABLE IF NOT EXISTS users(id INTEGER,
 name STRING,
 PRIMARY KEY(id))

/* Create a new table called users and set the TTL value to 4 days */
CREATE TABLE IF NOT EXISTS users(id INTEGER,
 name STRING,
 PRIMARY KEY(id))
USING TTL 4 days

/* Create a new index called nameIdx on the name field in the users table */
CREATE INDEX IF NOT EXISTS nameIdx ON users(name)

次の例では、NoSQLハンドルの取得時に、デフォルトのコンパートメントがNoSQLHandleConfigに指定されていると想定しています。 NoSQLハンドルの取得 を参照してください。NoSQL表のコンパートメントを指定する他のオプションを調べるには、コンパートメントについて を参照してください。

TableRequestとそのメソッドを使用して表および索引を作成します。

/* Create a simple table with an integer key and a single json data
 * field  and set your desired table capacity.
 * Set the table TTL value to 3 days.
 */
String createTableDDL = "CREATE TABLE IF NOT EXISTS users " +
 "(id INTEGER, name STRING, " +
 "PRIMARY KEY(id)) USING TTL 3 days";
/* Call the appropriate constructor for 
 * 1) Provisioned Capacity
 * TableLimits limits = new TableLimits(50, 50, 25);
 * 2) On-demand Capacity - only set storage limit
 * TableLimits limits = new TableLimits( 5 );   
 * In this example, we will use Provisioned Capacity 
*/
TableLimits limits = new TableLimits(50, 50, 25);
TableRequest treq = new TableRequest().setStatement(createTableDDL)
 .setTableLimits(limits);

// start the asynchronous operation
TableResult tres = handle.tableRequest(treq);

// wait for completion of the operation
tres.waitForCompletion(handle,
 60000, // wait for 60 sec
 1000); // delay in ms for poll
 

// Create an index called nameIdx on the name field in the users table.
treq = new TableRequest().setStatement("CREATE INDEX 
  IF NOT EXISTS nameIdx ON users(name)
  ");

// start the asynchronous operation
  handle.tableRequest(treq);

// wait for completion of the operation
  tres.waitForCompletion(handle,
   60000, // wait for 60 sec
   1000); // delay in ms for poll

表のリストを検索します。

表のリストを取得できます。
ListTablesRequest tablereq = new ListTablesRequest();
String [] tablelis = handle.listTables(tablereq).getTables();
if (tablelis.length == 0)   
   System.out.println("No tables avaiable");
else {  
   System.out.println("The tables available are");   
   for (int i=0;i< tablelis.length; i++)  {    
      System.out.println(tablelis[i]);  
   }
}
表のスキーマはいつでもフェッチできます。
GetTableRequest gettblreq = new GetTableRequest();
gettblreq.setTableName(tableName);
System.out.println("The schema details for the table is " 
+ handle.getTable(gettblreq).getSchema());
DDL文は、borneo.TableRequestクラスを使用して実行されます。borneo.NoSQLHandle.table_request()へのすべてのコールは非同期であるため、結果を確認し、borneo.TableResult.wait_for_completion()をコールして操作が完了するまで待機する必要があります。
#Create a simple table with an integer key and a single 
#json data field and set your desired table capacity. 
#Set the table TTL value to 3 days.
from borneo import TableLimits,
TableRequest statement = 'create table if not exists users(id integer, 
                                              name string,
                                              ' + 'primary key(id) 
                                                 USING TTL 3 DAYS'
# In the Cloud Service TableLimits is a required object for table 
#creation. It specifies the throughput and capacity for the table in 
#ReadUnits,  WriteUnits, GB
# Call the appropriate constructor for 
# 1) Provisioned Capacity
# TableLimits(50, 50, 25);
#  2) On-demand Capacity - only set storage limit
# TableLimits( 25 );  
# In this example, we will use Provisioned Capacity 
request = TableRequest().set_statement(statement).
                        set_table_limits( TableLimits(50, 50, 25))
# assume that a handle has been created, as handle, make the request 
#wait for 60 seconds, polling every 1 seconds
result = handle.do_table_request(request, 60000, 1000) 
# the above call to do_table_request is equivalent to 
# result = handle.table_request(request)
result.wait_for_completion(handle, 60000, 1000)
#Create an index called nameIdx on the name field in the users table.
request = TableRequest().set_statement("CREATE INDEX IF NOT EXISTS nameIdx 
                                        ON users(name)")
# assume that a handle has been created, as handle, make the request 
#wait for 60 seconds, polling every 1 seconds
result = handle.do_table_request(request, 60000, 1000) 
# the above call to do_table_request is equivalent to
# result = handle.table_request(request) 
result.wait_for_completion(handle, 60000, 1000)

表のリストを検索します。

表のリストを取得できます。
ltr = ListTablesRequest()
list(str)= handle.list_tables(ltr).getTables()
if list(str).len() = 0 
   print ("No tables available")
else 
   print('The tables available are: ' + list(str))
表のスキーマはいつでもフェッチできます。
request = GetTableRequest().set_table_name(table_name)
result = handle.get_table(request)
print('The schema details for the table is: ' + result.get_schema())
次の例では、整数キーと単一のSTRINGフィールドを含む単純な表を作成します。表の作成リクエストは非同期です。表の作成が完了するまで待機します。
// Create a simple table with an integer key and a single
// json data field and set your desired table capacity.
// Set the table TTL value to 3 days.
tableName := "users"
stmt := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s "+
    "(id integer, name STRING, PRIMARY KEY(id) "+
    "USING TTL 3 DAYS)", tableName)
// Call the appropriate constructor for
// 1) Provisioned Capacity
// &nosqldb.TableLimits(ReadUnits: 50, WriteUnits: 50, StorageGB: 25);
// 2) On-demand Capacity - only set storage limit
// &nosqldb.TableLimits(StorageGB: 25 );   
// In this example, we will use Provisioned Capacity
tableReq := &nosqldb.TableRequest{
    Statement: stmt,
    TableLimits: &nosqldb.TableLimits{
        ReadUnits:  50,
        WriteUnits: 50,
        StorageGB:  25,
    },
}
tableRes, err := client.DoTableRequest(tableReq)
if err != nil {
    fmt.Printf("cannot initiate CREATE TABLE request: %v\n", err)
    return
}
_, err = tableRes.WaitForCompletion(client, 60*time.Second, time.Second)
if err != nil {
    fmt.Printf("Error finishing CREATE TABLE request: %v\n", err)
    return
}
fmt.Println("Created table ", tableName)
//Create an index called nameIdx on the name field in the users table
stmt_ind := fmt.Sprintf("CREATE INDEX IF NOT EXISTS nameIdx ON users(name)")
tableReq := &nosqldb.TableRequest{Statement: stmt_ind}
tableRes, err := client.DoTableRequest(tableReq)
if err != nil {
    fmt.Printf("cannot initiate CREATE INDEX request: %v\n", err)
    return
}
_, err = tableRes.WaitForCompletion(client, 60*time.Second, time.Second)
if err != nil {
    fmt.Printf("Error finishing CREATE INDEX request: %v\n", err)
    return
}
fmt.Println("Created index nameIdx ")

表のリストを検索します。

表のリストを取得できます。
req := &nosqldb.ListTablesRequest{Timeout: 3 * time.Second,}
res, err := client.ListTables(req)
if len(res.Tables)== 0{
   fmt.Printf("No tables in the given compartment"
   return
}
fmt.Printf("The tables in the given compartment are:\n" )
for i, table := range res.Tables {
   fmt.Printf(table)
}
表のスキーマはいつでもフェッチできます。
req := &nosqldb.GetTableRequest{
TableName: table_name, Timeout: 3 * time.Second, }
res, err := client.GetTable(req)
fmt.Printf("The schema details for the table is:state=%s, 
   limits=%v\n", res.State,res.Limits)

表DDL文は、tableDDLメソッドによって実行されます。NoSQLClientクラスの他のほとんどのメソッドと同様に、このメソッドは非同期で、TableResultのPromiseを返します。TableResultは、TableState、名前、スキーマ、TableLimitなどのDDL操作のステータスを含むプレーンJavaScriptオブジェクトです。

tableDDLメソッドは、2番目のオプション引数としてopopオブジェクトを取得します。表を作成するときは、opt引数の一部としてTableLimitsを指定する必要があります。TableLimitsでは、読取りユニット、書込みユニットおよびギガバイトのストレージの量として、表の最大スループットおよびストレージ容量を指定します。

tableDDLメソッドは、基礎となるストア内の指定されたDDL操作のみを起動し、その完了を待機しないことに注意してください。結果のTableResultは、多くの場合、TableState.CREATINGTableState.DROPPINGTableState.UPDATINGなどの中間表の状態のいずれかになります(後者は、表がALTER TABLE文による変更処理中、表の制限が変更中、またはその索引の1つが作成または削除されている場合に発生します)。

基礎となる操作が完了すると、表の状態がTableState.ACTIVEまたはTableState.DROPPED (DDL操作がDROP TABLEの場合は後者)に変更されます。
const NoSQLClient = require('oracle-nosqldb').NoSQLClient;
const TableState = require('oracle-nosqldb').TableState;
const client = new NoSQLClient('config.json');

async function createUsersTable() {
    try {
        const statement = 'CREATE TABLE IF NOT EXISTS users(id INTEGER, ' +
            'name STRING, PRIMARY KEY(id))';
// Call the appropriate constructor for
// 1) Provisioned Capacity
//  tableLimits: {readUnits: 50, writeUnits: 50, storageGB: 25);
// 2) On-demand Capacity - only set storage limit
//  tableLimits: {storageGB: 25 );   
// In this example, we will use Provisioned Capacity
        let result = await client.tableDDL(statement, {
            tableLimits: {
                readUnits: 50,
                writeUnits: 50,
                storageGB: 25
            }
        });
        result = await client.forCompletion(result);
        console.log('Table users created');
    } catch(error) {
        //handle errors
    }
}
前述のコールが返された後、結果には操作の最終状態が反映されます。または、完全なオプションを使用するには、上のtry-catchブロックのコードを次のように置き換えます。
const statement = 'CREATE TABLE IF NOT EXISTS users(id INTEGER, ' +
        'name STRING, PRIMARY KEY(id))';
// Call the appropriate constructor for
// 1) Provisioned Capacity
//  tableLimits: {readUnits: 50, writeUnits: 50, storageGB: 25);
// 2) On-demand Capacity - only set storage limit
//  tableLimits: {storageGB: 25 );   
// In this example, we will use Provisioned Capacity
    let result = await client.tableDDL(statement, {
        tableLimits: {
            readUnits: 50,
            writeUnits: 50,
            storageGB: 25
        },
        complete: true
    });
    console.log('Table users created');

CREATE TABLE以外のDDL操作にTableLimitsを指定する必要はありません。また、setTableLimitsメソッドをコールして表の作成後に表の制限を変更することもできます。また、tableDDLによって開始された操作の完了を待機する場合と同様に、操作の完了を待機する必要もあります。

// Create an index called nameIdx on the name field in the users table.
try {
   const statement = 'CREATE INDEX IF NOT EXISTS nameIdx ON users(name))';
   let result = await client.tableDDL(statement);
   result = await client.forCompletion(result);
   console.log('Index nameIdx created');
} catch(error){
  //handle errors 
}

表のリストを検索します。

表のリストを取得できます。
let varListTablesResult = await client.listTables();
console.log("The tables in the given compartment are:")
{res.send(varListTablesResult)}
表のスキーマはいつでもフェッチできます。
let resExistingTab = await client.getTable(tablename);
{ await client.forCompletion(resExistingTab);}
console.log("The  schema details for the table is:")
{ res.send(resExistingTab.schema)}

表を作成し、表の作成、変更および削除、索引の作成および削除などの他のデータ定義言語(DDL)文を実行するには、メソッドExecuteTableDDLAsyncおよびExecuteTableDDLWithCompletionAsyncを使用します。メソッドExecuteTableDDLAsyncおよびExecuteTableDDLWithCompletionAsyncは、Task<TableResult>を返します。TableResultインスタンスには、TableState、表スキーマ、TableLimitsなどのDDL操作のステータスが含まれます。これらの各メソッドには、複数のオーバーロードが付属しています。特に、DDL操作のオプションをTableDDLOptionsとして渡すことができます。

表を作成する場合は、そのTableLimitsを指定する必要があります。表の制限では、読取りユニット、書込みユニットおよびギガバイトのストレージの量として、表の最大スループットおよびストレージ容量を指定します。tableLimitsパラメータを取得するオーバーロードを使用するか、TableDDLOptionsTableLimitsプロパティとして表の制限を渡すことができます。これらは、実行に時間がかかる可能性があることに注意してください。メソッドExecuteTableDDLAsyncは、サービスによって指定されたDDL操作のみを起動し、その完了を待機しません。戻されたTableResultインスタンスでWaitForCompletionAsyncをコールすると、表DDL操作の完了を非同期で待機できます。
var client = new NoSQLClient("config.json");
try { 
  var statement = "CREATE TABLE IF NOT EXISTS users(id INTEGER,"
    + "name STRING, PRIMARY KEY(id))";
// Call the appropriate constructor for
// 1) Provisioned Capacity
// new TableLimits(50, 50, 25);
// 2) On-demand Capacity - only set storage limit
// new TableLimits( 25 );   
// In this example, we will use Provisioned Capacity
  var result = await client.ExecuteTableDDLAsync(statement, new
    TableLimits(50, 50, 25)); 
  await result.WaitForCompletionAsync(); 
  Console.WriteLine("Table users created."); 
} catch(Exception ex) {
   // handle exceptions
}
WaitForCompletionAsyncは、操作の完了を反映するようにコール元のTableResultインスタンスを変更します。
または、ExecuteTableDDLWithCompletionAsyncを使用することもできます。try-catchブロック内の文を次のように置き換えます。
var statement = "CREATE TABLE IF NOT EXISTS users(id INTEGER,"
    + "name STRING, PRIMARY KEY(id))"; 
// Call the appropriate constructor for
// 1) Provisioned Capacity
// new TableLimits(50, 50, 25);
// 2) On-demand Capacity - only set storage limit
// new TableLimits(25 );   
// In this example, we will use Provisioned Capacity
await client.ExecuteTableDDLWithCompletionAsync(statement, 
       new  TableLimits(50, 50, 25)); 
Console.WriteLine("Table users created.");
CREATE TABLE以外のDDL操作にTableLimitsを指定する必要はありません。SetTableLimitsAsyncまたはSetTableLimitsWithCompletionAsyncメソッドをコールして、既存の表の表制限を変更することもできます。

表のリストを検索します。

表のリストを取得できます。
varresult = await client.ListTablesAsync(); 
console.WriteLine("The tables in the given compartment are:") 
foreach(var tableName inresult.TableNames){
   Console.WriteLine(tableName);
}

関連トピック