Uso de API para crear tablas e índices en Oracle NoSQL Database Cloud Service

Descubra cómo crear tablas e índices a partir de Java, Python, Go, Node.js o . Aplicación NET.

En este artículo se incluyen los siguientes temas:

Acerca de los controladores SDK de Oracle NoSQL Database

Obtenga información sobre los controladores de Oracle NoSQL Database SDK.

El controlador de SDK de Oracle NoSQL Database contiene los archivos que permiten a una aplicación comunicarse con el entorno local, con Oracle NoSQL Database Cloud Service o con el simulador de Oracle NoSQL Database Cloud.

El SDK de Oracle NoSQL Database para Java está disponible en el repositorio de Maven Central, más información aquí. La ubicación principal del proyecto es en GitHub.

Puede obtener todos los archivos necesarios para ejecutar el SDK con las siguientes dependencias de archivos POM.
Nota

La versión cambia con cada versión.
<dependency>
  <groupId>com.oracle.nosql.sdk</groupId>
  <artifactId>nosqldriver</artifactId>
  <version>5.2.31</version>
</dependency>

Oracle NoSQL Database SDK para Java le proporciona todas las clases, los métodos, las interfaces y los ejemplos de Java. La documentación está disponible como javadoc en GitHub o en la Guía de referencia de la API de Java.

Puede instalar el SDK de Python mediante el índice de paquetes de Python con el comando indicado a continuación.

pip3 install borneo

El SDK para Python de Oracle NoSQL le proporciona todas las clases, métodos, interfaces y ejemplos de Python. La documentación está disponible en la Guía de referencia de API de Python.

Abra la página Ir descargas en un explorador y haga clic en el separador de descarga correspondiente al sistema operativo. Guarde el archivo en la carpeta de inicio.

Install Go en su sistema operativo.
  • En sistemas Windows, abra el archivo MSI que descargó y siga las indicaciones para instalar Go.
  • En sistemas Linux, extraiga el archivo que descargó en /usr/local y cree un árbol Go en /usr/local/go. Agregue /usr/local/go/bin a la variable de entorno PATH.

Acceda a online godoc para obtener información sobre el uso del SDK y hacer referencia a los paquetes, tipos y métodos del controlador Go.

Descargue e instale Node.js 12.0.0 o una versión posterior de Node.js Downloads. Asegúrese de que el gestor de paquetes de nodos (npm) esté instalado junto con Node.js. Instale el SDK de nodo para Oracle NoSQL Database como se muestra a continuación.
npm install oracle-nosqldb

Acceda a la Guía de referencia de API de Node.js para hacer referencia a clases, eventos y objetos globales de Node.js.

Puede instalar el SDK desde NuGet Package Manager agregándolo como referencia al proyecto o de forma independiente.
  • Agregue el SDK como referencia de proyecto: puede agregar el paquete NuGet del SDK como referencia al proyecto mediante . CLI de red.
    cd <your-project-directory>
    dotnet add package Oracle.NoSQL.SDK
    También puede realizar lo mismo con NuGet Package Manager en Visual Studio.
  • Instalación independiente: puede instalar el SDK de forma independiente en un directorio de su elección mediante la CLI de nuget.exe.
    nuget.exe install Oracle.NoSQL.SDK -OutputDirectory
    <your-packages-directory>

Obtención de un identificador de NoSQL

Descubra cómo acceder a las tablas mediante Oracle NoSQL Database Drivers. Comience a desarrollar la aplicación creando un identificador de NoSQL. Utilice NoSQLHandle para acceder a las tablas y ejecutar todas las operaciones.

Para crear una conexión representada por NoSQLHandle, obtenga un identificador con el método NoSQLHandleFactory.createNoSQLHandle y la clase NoSQLHandleConfig. La clase NoSQLHandleConfig permite que una aplicación especifique la configuración del identificador. Consulte la Guía de referencia de API de Java para obtener más información.

Utilice el siguiente código para obtener un identificador 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

Un identificador tiene recursos de red y memoria asociados. Utilice el método NoSQLHandle.close para liberar los recursos cuando la aplicación termine con el identificador.

Para minimizar la actividad de red, y el exceso en la asignación y desasignación de recursos, es recomendable evitar la creación y el cierre repetidos de identificadores. Por ejemplo, crear y cerrar un identificador en cada operación produciría un bajo rendimiento de la aplicación. Un identificador permite operaciones simultáneas, por lo que un único identificador es suficiente para acceder a las tablas de una aplicación multithread. La creación de varios identificadores provoca un exceso de recursos adicionales y no supone ningún beneficio para el rendimiento.

Para crear un manejador, primero se crea una instancia borneo.NoSQLHandleConfig para configurar el punto final de comunicación, la información de autorización y los valores por defecto para la configuración del manejador. borneo.NoSQLHandleConfig representa una conexión al servicio. Una vez creado, se debe cerrar con el método borneo.NoSQLHandle.close() para limpiar los recursos. Los identificadores son seguros para los subprocesos y están diseñados para ser compartidos.

Ejemplo de adquisición de un identificador NoSQL para Oracle NoSQL Cloud Service:
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)
Nota

Para reducir el uso de recursos y la sobrecarga de creación de manejadores, es mejor evitar la creación y el cierre excesivos de instancias borneo.NoSQLHandle.
El primer paso de cualquier aplicación go de Oracle NoSQL Database Cloud Service es crear un manejador nosqldb.Client utilizado para enviar solicitudes al servicio. Las instancias del manejador de cliente son seguras para su uso simultáneo por varios goroutines y están destinadas a ser compartidas en una aplicación de varias grúas. El identificador se configura mediante sus credenciales y otra información de autenticación.
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

La clase NoSQLClient representa el punto de acceso principal al servicio. Para crear una instancia de NoSQLClient, debe proporcionar la información de configuración adecuada. Esta información se representa mediante un objeto JavaScript sin formato y se puede proporcionar al constructor de NoSQLClient como literal de objeto. También puede almacenar esta información en un archivo de configuración JSON y el constructor de NoSQLClient con la ruta (absoluta o relativa al directorio actual de la aplicación) a ese archivo.

El primer ejemplo siguiente crea una instancia de NoSQLClient para Cloud Service mediante el literal de objeto de configuración. También agrega un compartimento por defecto y sustituye algunos valores de timeout por defecto en el objeto de configuración.
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'
        }
    }
});

El segundo ejemplo almacena la misma configuración en un archivo JSON config.json y la utiliza para crear la instancia NoSQLClient.

Archivo config.json de ejemplo:
{ 
"region": "US_ASHBURN_1",
 "timeout": 20000,
 "ddlTimeout": 40000,
 "compartment": "mycompartment", 
 "auth": { 
    "iam": { 
       "configFile": "~/myapp/.oci/config",
       "profileName": "Jane"
    } 
  }
}
Código de aplicación:
const NoSQLClient = require('oracle-nosqldb').NoSQLClient;
let client = new NoSQLClient('config.json');

La clase NoSQLClient representa el punto de acceso principal al servicio. Para crear una instancia de NoSQLClient, debe proporcionar la información de configuración adecuada. Esta información se representa mediante la clase NoSQLConfig, instancia que se puede proporcionar al constructor de NoSQLClient. También puede almacenar la información de configuración en un archivo de configuración JSON y utilizar el constructor de NoSQLClient que toma la ruta (absoluta o relativa al directorio actual) a ese archivo.

En el primer ejemplo siguiente se crea una instancia de NoSQLClient para Cloud Service mediante NoSQLConfig. También agrega un compartimento por defecto y sustituye algunos valores de timeout por defecto en 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")
    });

El segundo ejemplo almacena la misma configuración en un archivo JSON config.json y la utiliza para crear la instancia NoSQLClient.

config.json
{
    "Region": "us-ashburn-1",
    "Timeout": 20000,
    "TableDDLTimeout": 40000,
    "compartment": "mycompartment",
    "AuthorizationProvider":
    {
        "AuthorizationType": "IAM",
        "ConfigFile": "~/myapp/.oci/config",
        "ProfileName": "Jane"
    }
}
Código de aplicación:
var client = new NoSQLClient("config.json");

Acerca de los compartimentos

Descubra cómo especificar el compartimento al crear y trabajar con tablas de Oracle NoSQL Database Cloud Service con controladores de Oracle NoSQL Database.

Las tablas de Oracle NoSQL Database Cloud Service se crean en un compartimento y se limitan a ese compartimento. Cuando se autentica como un usuario específico, las tablas se gestionan en el compartimento raíz del arrendamiento a menos que se especifique lo contrario. La organización de tablas en diferentes compartimentos ayudará en relación con la organización y la seguridad.

Si se ha autenticado mediante una instancia principal (accediendo al servicio desde una instancia informática de OCI), debe especificar un compartimento mediante su ID (OCID), ya que no hay valor por defecto en este caso. Consulte Llamada al servicio desde una instancia en la documentación de Oracle Cloud Infrastructure.

Hay varias formas de especificar un compartimento en el código de la aplicación:
  1. Utilice un compartimento por defecto en NoSQLHandleConfig para que se aplique a todas las operaciones que utilizan el identificador. Consulte Obtención de un identificador de NoSQL para obtener un ejemplo.
  2. Utilice el nombre o el ID de compartimento (OCID) en cada solicitud, además del nombre de tabla. Esto sustituye cualquier compartimento por defecto.
    Por ejemplo:
    GetRequest getReq = new GetRequest().setTableName("mytable")
                                        .setCompartment("mycompartment");
  3. Utilice el nombre del compartimento como prefijo en el nombre de la tabla. Esto sustituye cualquier compartimento por defecto, así como un compartimento especificado con API.
    Por ejemplo:
    GetRequest getReq = new GetRequest().setTableName("mycompartment:mytable");
Cuando se utiliza un compartimento con nombre, el nombre puede ser el nombre simple de un compartimento de nivel superior o una ruta a un compartimento anidado. En este caso, la ruta es una ruta separada por "." (punto).
Nota

Al especificar la ruta a un compartimento anidado, no incluya el nombre del compartimento de nivel superior en la ruta, puesto que se deduce del arrendamiento.
Hay varias formas de especificar un compartimento en el código de la aplicación:
  • Existe un método para permitir la especificación de un compartimento por defecto para las solicitudes en borneo.NoSQLHandleConfig.set_compartment(). Esto sustituye el compartimento por defecto del usuario.
  • Además, es posible especificar un compartimento en cada instancia Request.
Los métodos set_compartment toman un ID (OCID) o un nombre de compartimento o una ruta. Si se utiliza un nombre de compartimento, puede ser el nombre de un compartimento de nivel superior.
Nota

Si se utiliza una ruta de compartimento para hacer referencia a un compartimento anidado, la ruta es una ruta separada por puntos que excluye el compartimento de nivel superior de la ruta, por ejemplo, compartmentA.compartmentB.
En lugar de definir un compartimento en la solicitud, es posible utilizar un nombre de compartimento para prefijar un nombre de tabla en una solicitud, consulta o sentencia DDL. Este uso sustituye cualquier otro valor del compartimento. Por ejemplo,
...
request = PutRequest().set_table_name('mycompartment:mytable')
...
create_statement = 'create table mycompartment:mytable(...)' 
...
request = GetRequest().set_table_name('compartmentA.compartmentB')
Hay varias formas de especificar un compartimento en el código de la aplicación:
  • Puede definir un nombre o ID de compartimento deseado.
  • Se define en una cadena vacía para utilizar el compartimento por defecto, que es el compartimento raíz del arrendamiento.
  • Si utiliza un compartimento anidado, especifique la ruta completa del compartimento relativa al compartimento raíz como compartmentID. Por ejemplo, si utiliza rootCompartment.compartmentA.compartmentB, compartmentID se debe definir en compartmentA.compartmentB.
  • También puede utilizar el OCID de compartimento como valor de cadena.
compartmentID:="<optional-compartment-name-or-ID>"
iam.NewRawSignatureProvider(tenancy, user, region, fingerprint, compartmentID,
        privateKey, &privateKeyPassphrase)
El compartimento por defecto para las tablas es el compartimento raíz del arrendamiento del usuario. Se puede especificar un compartimento por defecto para todas las operaciones definiendo la propiedad Compartimento de NoSQLConfig. Por ejemplo:
const NoSQLClient = require('oracle-nosqldb').NoSQLClient;
const client = new NoSQLClient({
    region: Region.US_ASHBURN_1,
    compartment: 'mycompartment'
});

El valor de cadena puede ser un ID de compartimento, un nombre de compartimento o una ruta. Si es un nombre simple, debe especificar un compartimento de nivel superior. Si es una ruta a un compartimento anidado, el compartimento de nivel superior se debe excluir, ya que se infiere del arrendamiento. También se puede especificar un compartimento en cada solicitud en el objeto de opciones. Este valor sustituye el valor de configuración inicial.

Si no se proporciona el compartimento, se utilizará el OCID del arrendamiento por defecto. Tenga en cuenta que esto solo se aplica si está autorizando con la identidad del usuario. Al utilizar principal de instancia o principal de recurso, se debe especificar el ID de compartimento.

El compartimento por defecto para las tablas es el compartimento raíz del arrendamiento del usuario. Se puede especificar un compartimento por defecto para todas las operaciones definiendo la propiedad Compartimento de NoSQLConfig. Por ejemplo:
var client = new NoSQLClient(
    new NoSQLConfig
    {
        Region=Region.US_ASHBURN_1,
        Compartment="<compartment_ocid_or_name>"
    });
El valor de cadena puede ser un OCID de compartimento, un nombre de compartimento o una ruta. Si es un nombre simple, debe especificar un compartimento de nivel superior. Si es una ruta a un compartimento anidado, el compartimento de nivel superior se debe excluir, ya que se infiere del arrendamiento.

Además, todas las clases de opciones de operación tienen la propiedad Compartment, como TableDDLOptions.Compartment, GetOptions.Compartment, PutOptions.Compartment, etc. Por lo tanto, también puede especificar la comparación por separado para cualquier operación. Si se define, este valor sustituirá el valor de compartimento en NoSQLConfig, si lo hay.

Si no se proporciona el compartimento, se utilizará el OCID del arrendamiento por defecto. Tenga en cuenta que esto solo se aplica si está autorizando con la identidad del usuario. Al utilizar principal de instancia o principal de recurso, se debe especificar el ID de compartimento.

Creación de tablas e índices

Aprenda a crear tablas e índices.

Crear una tabla es el primer paso del desarrollo de la aplicación.

Utilice la clase API y los métodos para ejecutar todas las sentencias DDL como, por ejemplo, la creación, la modificación y el borrado de tablas. También puede establecer límites de tabla con el método de API.

Antes de crear una tabla, consulte:

Algunos ejemplos de sentencias DDL son:

/* 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)

El siguiente ejemplo considera que el compartimento por defecto se especifica en NoSQLHandleConfig al obtener el identificador de NoSQL. Consulte Obtención de un identificador de NoSQL . Para explorar otras opciones para especificar un compartimento para las tablas NoSQL, consulte Acerca de los compartimentos .

Cree una tabla e índice con TableRequest y sus métodos.

/* 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

Busque la lista de tablas:

Puede obtener una lista de tablas.
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]);  
   }
}
También puede recuperar el esquema de una tabla en cualquier momento.
GetTableRequest gettblreq = new GetTableRequest();
gettblreq.setTableName(tableName);
System.out.println("The schema details for the table is " 
+ handle.getTable(gettblreq).getSchema());
Las sentencias DDL se ejecutan mediante la clase borneo.TableRequest. Todas las llamadas a borneo.NoSQLHandle.table_request() son asíncronas, por lo que es necesario comprobar el resultado y llamar a borneo.TableResult.wait_for_completion() para esperar a que finalice la operación.
#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)

Busque la lista de tablas:

Puede obtener una lista de tablas.
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))
También puede recuperar el esquema de una tabla en cualquier momento.
request = GetTableRequest().set_table_name(table_name)
result = handle.get_table(request)
print('The schema details for the table is: ' + result.get_schema())
En el siguiente ejemplo, se crea una tabla simple con una clave de entero y un único campo STRING. La solicitud de creación de tabla es asíncrona. Espera a que finalice la creación de la tabla.
// 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 ")

Busque la lista de tablas:

Puede obtener una lista de tablas.
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)
}
También puede recuperar el esquema de una tabla en cualquier momento.
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)

Las sentencias DDL de tabla se ejecutan mediante el método tableDDL. Al igual que la mayoría de los otros métodos de la clase NoSQLClient, este método es asíncrono y devuelve una promesa de TableResult. TableResult es un objeto JavaScript sin formato que contiene el estado de la operación DDL, como TableState, nombre, esquema y TableLimit.

El método tableDDL toma el objeto opt como el 2o argumento opcional. Al crear una tabla, debe especificar TableLimits como parte del argumento opt. TableLimits especifica el rendimiento y la capacidad de almacenamiento máximos para la tabla como la cantidad de unidades de lectura, unidades de escritura y GB de almacenamiento.

Tenga en cuenta que el método tableDDL solo inicia la operación DDL especificada en el almacén subyacente y no espera su finalización. La TableResult resultante tendrá probablemente uno de los estados de tabla intermedios como TableState.CREATING, TableState.DROPPING o TableState.UPDATING (esta última se produce cuando la tabla está en proceso de ser modificada por la sentencia ALTER TABLE, se están cambiando los límites de tabla o se está creando o borrando uno de sus índices).

Cuando finaliza la operación subyacente, el estado de la tabla debe cambiar a TableState.ACTIVE o TableState.DROPPED (este último si la operación DDL es 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
    }
}
Una vez que se devuelve la llamada anterior, el resultado reflejará el estado final de la operación. Como alternativa, para utilizar la opción completa, sustituya el código del bloque try-catch anterior por el siguiente:
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');

No es necesario especificar TableLimits para ninguna operación DDL que no sea CREATE TABLE. También puede cambiar los límites de tabla de la tabla después de crearla llamando al método setTableLimits. Esto también puede necesitar esperar a que finalice la operación de la misma manera que esperar a que finalicen las operaciones iniciadas por 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 
}

Busque la lista de tablas:

Puede obtener una lista de tablas.
let varListTablesResult = await client.listTables();
console.log("The tables in the given compartment are:")
{res.send(varListTablesResult)}
También puede recuperar el esquema de una tabla en cualquier momento.
let resExistingTab = await client.getTable(tablename);
{ await client.forCompletion(resExistingTab);}
console.log("The  schema details for the table is:")
{ res.send(resExistingTab.schema)}

Para crear tablas y ejecutar otras sentencias de lenguaje de definición de datos (DDL), como la creación, modificación y borrado de tablas, así como la creación y borrado de índices, utilice los métodos ExecuteTableDDLAsync y ExecuteTableDDLWithCompletionAsync. Los métodos ExecuteTableDDLAsync y ExecuteTableDDLWithCompletionAsync devuelven Task<TableResult>. La instancia TableResult contiene el estado de la operación DDL, como TableState, esquema de tabla y TableLimits. Cada uno de estos métodos viene con varias sobrecargas. En particular, puede transferir opciones para la operación DDL como TableDDLOptions.

Al crear una tabla, debe especificar TableLimits. Los límites de tabla especifican el rendimiento y la capacidad de almacenamiento máximos para la tabla como la cantidad de unidades de lectura, unidades de escritura y GB de almacenamiento. Puede utilizar una sobrecarga que tome el parámetro tableLimits o transfiera los límites de tabla como propiedad TableLimits de TableDDLOptions. Tenga en cuenta que son operaciones de ejecución potencialmente largas. El método ExecuteTableDDLAsync solo inicia la operación DDL especificada por el servicio y no espera su finalización. Puede esperar de forma asíncrona a que termine la operación DDL de la tabla llamando a WaitForCompletionAsync en la instancia TableResult devuelta.
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
}
Tenga en cuenta que WaitForCompletionAsync cambiará la instancia TableResult de llamada para reflejar la finalización de la operación.
También puede utilizar ExecuteTableDDLWithCompletionAsync. Sustituya las sentencias del bloque try-catch por lo siguiente:
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.");
No es necesario especificar TableLimits para ninguna operación DDL que no sea CREATE TABLE. También puede cambiar los límites de tabla de una tabla existente llamando a los métodos SetTableLimitsAsync o SetTableLimitsWithCompletionAsync.

Busque la lista de tablas:

Puede obtener una lista de tablas.
varresult = await client.ListTablesAsync(); 
console.WriteLine("The tables in the given compartment are:") 
foreach(var tableName inresult.TableNames){
   Console.WriteLine(tableName);
}

Temas relacionados