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 SDK de Oracle NoSQL Database.

Oracle NoSQL Database SDK Driver contiene los archivos que permiten que una aplicación se comunique con las ubicaciones locales, Oracle NoSQL Database Cloud Service u Oracle NoSQL Database Cloud Simulator.

Oracle NoSQL Database SDK para Java está disponible en el repositorio central de Maven. Puede obtener más información aquí. La ubicación principal del proyecto está 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 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 Java API Reference Guide.

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

pip3 install borneo

El SDK para Python de Oracle NoSQL 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 a descargas en un explorador y haga clic en el separador de descarga correspondiente al sistema operativo. Guarde el archivo en la carpeta inicial.

Instale Go en el sistema operativo.
  • En sistemas Windows, abra el archivo MSI que descargó y siga las indicaciones para instalar Go.
  • En sistemas Linux, extraiga el archivo descargado 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 godoc en línea para obtener información sobre el uso del SDK y hacer referencia a 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 Node Package Manager (npm) esté instalado junto con Node.js. Instale el SDK del nodo para Oracle NoSQL Database, como se muestra a continuación.
npm install oracle-nosqldb

Acceda a la Guía de referencia de API 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 a su proyecto o de forma independiente.
  • Agregue el SDK como referencia de proyecto: puede agregar el paquete NuGet del SDK como referencia al proyecto mediante la CLI de .Net.
    cd <your-project-directory>
    dotnet add package Oracle.NoSQL.SDK
    También puede realizar la misma acción con NuGet Package Manager en Visual Studio.
  • Instalación independiente: puede instalar el SDK de forma independiente en el directorio que desee mediante la CLI nuget.exe.
    nuget.exe install Oracle.NoSQL.SDK -OutputDirectory
    <your-packages-directory>

El SDK para datos de Spring de Oracle NoSQL Database está disponible en el repositorio central de Maven. Los detalles están disponibles aquí. La ubicación de desarrollo principal es el proyecto oracle-spring-sdk en GitHub.

Puede obtener todos los archivos necesarios para ejecutar Spring Data Framework con las siguientes dependencias de archivos POM.
Nota

La versión cambia con cada versión.

<dependency>
    <groupId>com.oracle.nosql.sdk</groupId>
    <artifactId>spring-data-oracle-nosql</artifactId>
    <version>1.4.1</version>
</dependency>
Agregue la dependencia adicional para utilizar Spring Data Framework:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.7.0</version>
</dependency>

El SDK para datos de Spring de Oracle NoSQL Database proporciona todas las clases, métodos, interfaces y ejemplos de Spring Data. La documentación está disponible como nosql-spring-sdk en GitHub o en Referencia de API de SDK para Spring Data.

Obtención de un identificador de NoSQL

Descubra cómo acceder a las tablas mediante los controladores de Oracle NoSQL Database. 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, así como los valores por defecto para la configuración del manejador. borneo.NoSQLHandleConfig representa una conexión al servicio. Una vez creada, se debe cerrar con el método borneo.NoSQLHandle.close() para limpiar los recursos. Los manejadores son seguros para threads y están destinados a ser compartidos.

Ejemplo de adquisición de un manejador 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 la 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 uso simultáneo de varias goroutinas y están diseñadas para ser compartidas en una aplicación de varias goroutinas. El manejador se configura con 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 está representada por 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 en el constructor de NoSQLClient con la ruta (absoluta o relativa al directorio actual de la aplicación) a ese archivo.

El primer ejemplo a continuación 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 está representada por la clase NoSQLConfig, que instancia 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.

El primer ejemplo a continuación crea la 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");

Obtención de una conexión NoSQL

En una aplicación Spring Data, debe configurar la clase AppConfig que proporciona un bean de Spring NosqlDbConfig. El bean de primavera NosqlDbConfig describe cómo conectarse a Oracle NoSQL Database Cloud Service.

Cree la clase AppConfig que amplíe la clase AbstractNosqlConfiguration. De esta forma se muestran los parámetros de conexión y seguridad al SDK de Oracle NoSQL Database para Spring Data.

Devuelva un objeto de instancia NosqlDbConfig con los detalles de conexión a Oracle NoSQL Database Cloud Service. Proporcione las anotaciones @Configuration y @EnableNoSQLRepositories a esta clase NosqlDbConfig. La anotación @Configuration informa al marco de datos de Spring de que la clase AppConfig es una clase de configuración que se debe cargar antes de ejecutar el programa. La anotación @EnableNoSQLRepositories informa al marco de datos de Spring que necesita cargar el programa y buscar los repositorios que amplían la interfaz NosqlRepository. La anotación @Bean es necesaria para que los repositorios se instancien.

Cree un método anotado nosqlDbConfig @Bean para devolver una instancia de la clase NosqlDBConfig. El marco de datos de Spring utilizará el objeto de instancia NosqlDBConfig para autenticar Oracle NoSQL Database Cloud Service.

Puede utilizar diferentes métodos para conectarse a Oracle NoSQL Database Cloud Service. Para obtener más información, consulte Conexión de la aplicación a NDCS.

En el siguiente ejemplo, se autentica con el método SignatureProvider. Necesita el ID de arrendamiento, el ID de usuario y la información de huella que se puede encontrar en la página de perfil de usuario de la cuenta en la nube en el separador User Information de View Configuration File. También puede agregar la frase de contraseña a su clave privada. Para obtener más información, consulte Autenticación para conectarse a Oracle NoSQL Database.
import com.oracle.nosql.spring.data.config.AbstractNosqlConfiguration;
import com.oracle.nosql.spring.data.config.NosqlDbConfig;
import com.oracle.nosql.spring.data.repository.config.EnableNosqlRepositories;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import oracle.nosql.driver.kv.StoreAccessTokenProvider;
 
import oracle.nosql.driver.Region;
import oracle.nosql.driver.iam.SignatureProvider;
import java.io.File;
 
public class AppConfig extends AbstractNosqlConfiguration
 
{
    /* Annotation to tell the Spring Data Framework that the returned object should be registered as a bean in the Spring application.*/
    @Bean
    public NosqlDbConfig nosqlDbConfig()
    {
        SignatureProvider signatureProvider;
        char passphrase[] = < Pass phrase > ; //Optional. A passphrase for the key, if it is encrypted.
 
        /* Details that are required to authenticate and authorize access to the Oracle NoSQL Database Cloud Service are provided.*/
        signatureProvider = new SignatureProvider(
            < tenantID > , //The Oracle Cloud Identifier (OCID) of the tenancy.
            < userID > , //The Oracle Cloud Identifier (OCID) of a user in the tenancy.
            < fingerprint > , //The fingerprint of the key pair used for signing.
            new File( < privateKeyFile > ), //Full path to the key file.
            passphrase //Optional.
        );
 
        /* Provide the service URL of the Oracle NoSQL Database Cloud Service and update the Region.<Region name>.endpoint() with the appropriate value.
           For example, Region.US_ASHBURN_1.endpoint() .*/
 
        return new NosqlDbConfig(Region. < Region name > .endpoint(), signatureProvider);
    }

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 de acceso. 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 de acceso es una ruta de acceso separada por puntos que excluye el compartimento de nivel superior de la ruta de acceso, por ejemplo, compartmentA.compartmentB.
En lugar de definir un compartimento en la solicitud, se puede utilizar un nombre de compartimento para anteponer 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, es decir, el compartimento raíz del arrendamiento.
  • Si utiliza un compartimento anidado, especifique la ruta de compartimento completa relativa al compartimento raíz como compartmentID. Por ejemplo, si se 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 o un nombre de compartimento o una ruta. Si es un nombre simple, debe especificar un compartimento de nivel superior. Si se trata de una ruta de acceso 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 del objeto Options. Este valor sustituye el valor de configuración inicial.

Si no se proporciona el compartimento, el OCID del arrendamiento se utilizará por defecto. Tenga en cuenta que esto solo se aplica si está autorizando con la identidad del usuario. Al utilizar el principal de instancia o el 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 o un nombre o ruta de acceso de compartimento. Si es un nombre simple, debe especificar un compartimento de nivel superior. Si se trata de una ruta de acceso 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, el OCID del arrendamiento se utilizará por defecto. Tenga en cuenta que esto solo se aplica si está autorizando con la identidad del usuario. Al utilizar el principal de instancia o el 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 de API y los métodos para ejecutar todas las sentencias DDL como, por ejemplo, crear, modificar y borrar 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. La clase TableRequest permite transferir una sentencia DDL al método TableRequest.setStatement.

/* 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 termine 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 termine 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 demás 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 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. Lo más probable es que el TableResult resultante tenga uno de los estados de tabla intermedios, como TableState.CREATING, TableState.DROPPING o TableState.UPDATING (lo último ocurre cuando la tabla está en proceso de ser modificada por la sentencia ALTER TABLE, se están cambiando los límites de la tabla o se está creando o borrando uno de sus índices).

Cuando finalice 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
    }
}
Después de que se devuelva la llamada anterior, el resultado reflejará el estado final de la operación. Alternativamente, para utilizar la opción completa, sustituya el código en el 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 requerir esperar a que finalice la operación de la misma forma 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 del lenguaje de definición de datos (DDL), como crear, modificar y borrar tablas, así como crear y borrar í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 y el esquema de tabla. 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 su 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 la tabla como propiedad TableLimits de TableDDLOptions.

Tenga en cuenta que son operaciones potencialmente de larga ejecución. El método ExecuteTableDDLAsync solo inicia la operación DDL especificada por el servicio y no espera su finalización. Puede esperar a que termine la operación DDL de la tabla de forma asíncrona 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 de llamada TableResult para reflejar la finalización de la operación.
También puede utilizar ExecuteTableDDLWithCompletionAsync. Sustituya las sentencias en el 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);
}

En las aplicaciones de datos de Spring, las tablas se crean automáticamente al principio de la aplicación cuando se inicializan las entidades a menos que @NosqlTable.autoCreateTable se defina en false.

Cree una clase de entidad Users para mantener. Esta clase de entidad representa una tabla en Oracle NoSQL Database y una instancia de esta entidad se corresponde con una fila de esa tabla.

Puede definir el valor por defecto TableLimits en la instancia @NosqlDbConfig mediante los métodos NosqlDbConfig.getDefaultCapacityMode(), NosqlDbConfig.getDefaultStorageGB(), NosqlDbConfig.getDefaultReadUnits() y NosqlDbConfig.getDefaultWriteUnits(). TableLimits también se puede especificar por tabla si se utiliza la anotación @NosqlTable, mediante los campos capacityMode, readUnits, writeUnits y storageGB.

Proporcione la anotación @NosqlId para indicar el campo ID. El atributo generated=true especifica que el ID se generará automáticamente. Para obtener más información sobre todas las clases, métodos, interfaces y ejemplos de Spring Data, consulte SDK for Spring Data API Reference.

Si el tipo de campo ID es String, se utilizará un UUID. Si el tipo de campo ID es int o long, se utiliza una secuencia "GENERATED ALWAYS as IDENTITY (NO CYCLE)".

import com.oracle.nosql.spring.data.core.mapping.NosqlId;
import com.oracle.nosql.spring.data.core.mapping.NosqlTable;
 
/* Set the TableLimits. */
@NosqlTable(readUnits = 50, writeUnits = 50, storageGB = 25)
 
public class Users
{
    @NosqlId(generated = true)
    long id;
    String firstName;
    String lastName;
 
    /* public or package protected constructor required when retrieving from the database. */
    public Users() {
    }
 
    @Override
    public String toString()
    {
        return "Users{" +
            "id=" + id + ", " +
            "firstName=" + firstName + ", " +
            "lastName=" + lastName +
            '}';
    }
}
Cree la siguiente interfaz UsersRepository. Esta interfaz amplía la interfaz NosqlRepository y proporciona la clase de entidad y el tipo de dato de la clave primaria de esa clase como tipos con parámetros para la interfaz NosqlRepository. Esta interfaz NosqlRepository proporciona métodos que se utilizan para almacenar o recuperar datos de la base de datos.
import com.oracle.nosql.spring.data.repository.NosqlRepository;
 
/* The Users is the entity class and Long is the data type of the primary key in the Users class.
   This interface provides methods that return iterable instances of  the Users class. */
 
public interface UsersRepository extends NosqlRepository<Users, Long> {
    /* Search the Users table by the last name and return an iterable instance of the Users class.*/
    Iterable<Users> findByLastName(String lastname);
}
Puede utilizar la interfaz CommandLineRunner de Spring para mostrar el código de aplicación que implanta el método de ejecución y tiene el método main.
Nota

Puede codificar la funcionalidad según sus requisitos mediante la implantación de cualquiera de las distintas interfaces que proporciona Spring Data Framework. Para obtener más información sobre la configuración de una aplicación de inicio Spring, consulte Spring Boot.
import com.oracle.nosql.spring.data.core.NosqlTemplate;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
 
/* The @SpringBootApplication annotation helps you to build an application using Spring Data Framework rapidly.*/
@SpringBootApplication
public class App implements CommandLineRunner {
 
    /* The annotation enables Spring Data Framework to look up the configuration file for a matching bean.*/
    @Autowired
    private UsersRepository repo;
 
    public static void main(String[] args) {
        ConfigurableApplicationContext ctx =
                SpringApplication.run(App.class, args);
        SpringApplication.exit(ctx, () -> 0);
        ctx.close();
        System.exit(0);
    }
 
    @Override
    public void run(String... args) throws Exception {
    }
}
Cuando se crea una tabla mediante la aplicación Spring Data, se crea automáticamente un esquema por defecto, que incluye dos columnas: la columna de clave primaria (tipos String, int, long o timestamp) y una columna JSON denominada kv_json_.
Nota

Si ya existe una tabla, debe cumplir con el esquema generado.

Para crear un índice en un campo de la tabla Users, utilice NosqlTemplate.runTableRequest().

Cree la clase AppConfig que amplíe la clase AbstractNosqlConfiguration para proporcionar los detalles de conexión de Oracle NoSQL Database. Para obtener más información, consulte Obtención de una conexión NoSQL en el artículo Uso de API para crear tablas e índices en NDCS.

En la aplicación, instanciará la clase NosqlTemplate proporcionando el método create (NosqlDbConfig nosqlDBConfig) NosqlTemplate con la instancia de la clase AppConfig. A continuación, modifique la tabla con el método NosqlTemplate.runTableRequest(). Proporcione la sentencia NoSQL para la creación del índice en el método NosqlTemplate.runTableRequest().

En este ejemplo, creará un índice en el campo lastName de la tabla Users.
import com.oracle.nosql.spring.data.core.NosqlTemplate;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
 
/* Create an Index on the lastName field of the Users Table. */
 
try {
    AppConfig config = new AppConfig();
    NosqlTemplate idx = NosqlTemplate.create(config.nosqlDbConfig());
    idx.runTableRequest("CREATE INDEX IF NOT EXISTS nameIdx ON Users(kv_json_.lastName AS STRING)");
    System.out.println("Index created successfully");
} catch (Exception e) {
    System.out.println("Exception creating index" + e);
}

Temas relacionados