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.
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.
- 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.
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.
- Agregue el SDK como referencia de proyecto: puede agregar el paquete NuGet del SDK como referencia al proyecto mediante la CLI de .Net.
También puede realizar la misma acción con NuGet Package Manager en Visual Studio.cd <your-project-directory> dotnet add package Oracle.NoSQL.SDK
- 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.
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>
<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.
/* 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.
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)
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
.
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.
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
.
{
"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');
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.
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"
}
}
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.
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.
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.
- 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. - 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");
- 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");
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.
- 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
.
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.
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
.
...
request = PutRequest().set_table_name('mycompartment:mytable')
...
create_statement = 'create table mycompartment:mytable(...)'
...
request = GetRequest().set_table_name('compartmentA.compartmentB')
- 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)
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.
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.
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.
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:
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());
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:
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())
// 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:
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)
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.
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).
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
}
}
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');
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:
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)}
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
.
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.
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.");
SetTableLimitsAsync
o SetTableLimitsWithCompletionAsync
.Busque la 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.
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.
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 +
'}';
}
}
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);
}
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.
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 {
}
}
kv_json_
.
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()
.
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