Modificación de datos de tablas mediante API

Descubra cómo actualizar y suprimir datos de tablas de Oracle NoSQL Database Cloud Service mediante API.

En este artículo se incluyen los siguientes temas:

Modificación de tablas

Aprenda a modificar tablas.

Puede modificar una tabla para:

  • Agregar nuevos campos a una tabla existente

  • Suprimir los campos existentes actualmente en una tabla

  • Para cambiar el valor de TTL por defecto

  • Modificar los límites de la tabla

Algunos ejemplos de sentencias DDL son:
/* Add a new field to the table */
ALTER TABLE users (ADD age INTEGER)

/* Drop an existing field from the table */
ALTER TABLE users (DROP age)

/* Modify the default TTL value*/
ALTER TABLE users USING TTL 4 days

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.

Al modificar una tabla con capacidad aprovisionada, también puede utilizar el método TableRequests.setTableLimits para modificar los límites de la tabla.
TableLimits limits = new TableLimits(40, 10, 5);
TableRequest treq = new TableRequest().setTableName( "users" ).setTableLimits(limits);
TableResult tres = handle.tableRequest(treq);
/* wait for completion of the operation */ tres.waitForCompletion(handle, 60000,
/* wait for 60 sec */
1000);
También puede utilizar el SDK de Java de Oracle NoSQL Database para modificar una tabla y cambiar el modelo de capacidad a una configuración de capacidad bajo demanda. También puede elegir cambiar la capacidad de almacenamiento.
// Previous limit in Provisioned Mode
// TableLimits limits = new TableLimits(40, 10, 5);    
// Call the constructor to only set storage limit (for on-demand)    
TableLimits limits = newTableLimits(10);    
TableRequest treq = newTableRequest().setTableName("users").setTableLimits(limits);    
TableResult tres = serviceHandle.tableRequest(treq);    
tres.waitForCompletion(serviceHandle, 50000,3000);
Puede cambiar la definición de la tabla. El valor de TTL se cambia a continuación.
/* Alter the users table to modify the TTL value to 4 days. 
* When modifying the table schema or other table state you cannot also 
* modify the table limits. These must be independent operations. 
*/
String alterTableDDL = "ALTER TABLE users " + "USING TTL 4 days";
TableRequest treq = new TableRequest().setStatement(alterTableDDL); 
/* start the operation, it is asynchronous */
TableResult tres = handle.tableRequest(treq);
/* wait for completion of the operation */ 
tres.waitForCompletion(handle, 60000, 1000);
/* wait for 60 sec */
/* delay in ms for poll */
Si utiliza los límites de la tabla de Oracle NoSQL Database Cloud Service, puede modificarlos mediante borneo.TableRequest.set_table_limits(). Si la tabla está configurada con capacidad aprovisionada, los límites se pueden definir como se muestra en el siguiente ejemplo:
from borneo import TableLimits, TableRequest
# in this path the table name is required, as there is no DDL statement 
request = TableRequest().set_table_name('users')
request.set_table_limits(TableLimits(40, 10, 5))
result = handle.table_request(request)
# table_request is asynchronous, so wait for the operation to complete, 
# wait for 40 seconds, polling every 3 seconds 
result.wait_for_completion(handle, 40000, 3000)
También puede utilizar el SDK de Python de Oracle NoSQL Database para modificar una tabla y cambiar el modelo de capacidad a una configuración de capacidad bajo demanda. También puede elegir cambiar la capacidad de almacenamiento.
from borneo import TableLimits, TableRequest
# in this path the table name is required, as there is no DDL statement
request = TableRequest().set_table_name('users')
request.set_table_limits(TableLimits(10))
result = handle.table_request(request)
# table_request is asynchronous, so wait for the operation to complete,
# wait for 40 seconds, polling every 3 seconds
result.wait_for_completion(handle, 40000, 3000)
Puede cambiar el valor de TTL de una tabla como se muestra a continuación.
/* Alter the users table to modify the TTL value to 4 days. 
* When modifying the table schema or other table state you cannot also 
* modify the table limits. These must be independent operations. 
*/
TableRequest statement = "ALTER TABLE users " + "USING TTL 4 days";
request = TableRequest().set_statement(statement)
# 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) 
result.wait_for_completion(handle, 60000, 1000)
Especifique la sentencia DDL y otra información en TableRequest y ejecute la solicitud mediante la función nosqldb.DoTableRequest() o nosqldb.DoTableRequestAndWait().
req:=&nosqldb.TableRequest{
    Statement: "ALTER TABLE users (ADD age INTEGER)",
}
res, err:=client.DoTableRequestAndWait(req, 5*time.Second, time.Second)
Los límites de las tablas de Oracle NoSQL Database Cloud Service se pueden modificar mediante TableRequest.TableLimits. Si la tabla está configurada con capacidad aprovisionada, los límites se pueden definir como se muestra en el siguiente ejemplo.
req := &nosqldb.TableRequest{
    TableName: "users",
    TableLimits: &nosqldb.TableLimits{
        ReadUnits: 100,
        WriteUnits: 100,
        StorageGB: 5,
    },
}
res, err := client.DoTableRequestAndWait(req, 5*time.Second, time.Second)
También puede utilizar el SDK de Go de Oracle NoSQL Database para modificar una tabla y cambiar el modelo de capacidad a una configuración de capacidad bajo demanda. También puede elegir cambiar la capacidad de almacenamiento.
req := &nosqldb.TableRequest{ TableName: "users",
TableLimits: &nosqldb.TableLimits{StorageGB: 10}}
res, err := client.DoTableRequestAndWait(req, 5*time.Second, time.Second)
Utilice NoSQLClient#tableDDL para modificar una tabla emitiendo una sentencia DDL en esta tabla. Los límites de tabla se pueden modificar mediante el método setTableLimits. Toma el nombre de la tabla y el nuevo TableLimits como argumentos y devuelve Promise of TableResult. Si la tabla está configurada con capacidad aprovisionada, los límites se pueden definir como se muestra en el siguiente ejemplo.
const NoSQLClient = require('oracle-nosqldb').NoSQLClient;
const TableState = require('oracle-nosqldb').TableState;
const client = new NoSQLClient('config.json');

async function modifyUsersTableLimits() {
    const tableName = 'users';
    try {
        let result = await client.setTableLimits(tableName, {
            readUnits: 40,
            writeUnits: 10,
            storageGB: 5
        });
        // Wait for the operation completion using specified timeout and
        // specified polling interval (delay)
        await client.forCompletion(result, TableState.ACTIVE, {
            timeout: 30000,
            delay: 2000
        });
        console.log('Table limits modified');
    } catch(error) {
        //handle errors
    }
}
También puede utilizar el SDK de Oracle NoSQL Database Node.js para modificar una tabla y cambiar el modelo de capacidad a una configuración de capacidad bajo demanda. También puede elegir cambiar la capacidad de almacenamiento.
const NoSQLClient = require('oracle-nosqldb').NoSQLClient;
const TableState = require('oracle-nosqldb').TableState;
const client = new NoSQLClient('config.json');
async function modifyUsersTableLimits() {
const tableName = 'users';
  try {
     let result = await client.setTableLimits(tableName, {storageGB: 10 });
     // Wait for the operation completion using specified timeout and polling interval (delay)
     await client.forCompletion(result, TableState.ACTIVE, { timeout: 30000, delay: 2000 });
     console.log('Table limits modified');
  } 
  catch(error) { //handle errors } 
}
Puede cambiar el valor de TTL de una tabla como se muestra a continuación.
/* Alter the users table to modify the TTL value to 4 days. 
*/
const statement = 'ALTER TABLE users ' + 'USING TTL 4 days';
let result = await client.tableDDL(statement, complete: true });
console.log('Table users altered');

Utilice ExecuteTableDDLAsync o ExecuteTableDDLWithCompletionAsync para modificar una tabla emitiendo una sentencia DDL en esta tabla.

Los límites de tabla se pueden modificar mediante los métodos SetTableLimitsAsync o SetTableLimitsWithCompletionAsync. Toman el nombre de la tabla y el nuevo TableLimits como parámetros y devuelven Task<TableResult>. Si la tabla está configurada con capacidad aprovisionada, los límites se pueden definir como se muestra en el siguiente ejemplo.
var client = new NoSQLClient("config.json");
var tableName = "users";
try {
    var result = await client.SetTableLimitsWithCompletionAsync(
       tableName, new TableLimits(40, 10, 5));
    // Expected output: Table state is Active.
    Console.WriteLine("Table state is {0}.", result.TableState);
    Console.WriteLine("Table limits have been changed");
}
catch(Exception ex) {
    // handle exceptions
}
También puede utilizar Oracle NoSQL Database. NET SDK para modificar una tabla y cambiar el modelo de capacidad a una configuración de capacidad bajo demanda. También puede elegir cambiar la capacidad de almacenamiento.
var client = new NoSQLClient("config.json");
var tableName = "users";
try {
   var result = await client.SetTableLimitsWithCompletionAsync( tableName, new TableLimits(10));
   // Expected output: Table state is Active.
   Console.WriteLine("Table state is {0}.", result.TableState);
   Console.WriteLine("Table limits have been changed");
}
catch(Exception ex) { // handle exceptions }
Puede cambiar el valor de TTL de una tabla como se muestra a continuación.
/* Alter the users table to modify the TTL value to 4 days. 
*/
var statement = "ALTER TABLE users " + "USING TTL 4 days";
var result = await client.ExecuteTableDDLAsync(statement);
await result.WaitForCompletionAsync(); 
Console.WriteLine("Table users altered."); 
Para modificar una tabla, puede utilizar el método NosqlTemplate.runTableRequest(). Para obtener más información, consulte SDK for Spring Data API Reference.
Nota

Aunque el SDK de Spring Data proporciona una opción para modificar las tablas, no se recomienda modificar los esquemas, ya que el SDK de Spring Data espera que las tablas cumplan con el esquema por defecto (dos columnas: la columna de clave primaria de los tipos Cadena, int, long o timestamp y una columna JSON denominada kv_json_).

Supresión de datos

Aprenda a suprimir filas de la tabla.

Después de insertar o cargar datos en una tabla, puede suprimir las filas de la tabla cuando ya no sean necesarias.

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.

Para suprimir una fila de una tabla:
/* identify the row to delete */
MapValue delKey = new MapValue().put("id", 2);

/* construct the DeleteRequest */
DeleteRequest delRequest = new DeleteRequest().setKey(delKey)
                                              .setTableName("users");
/* Use the NoSQL handle to execute the delete request */
DeleteResult del = handle.delete(delRequest);
/* on success DeleteResult.getSuccess() returns true */
if (del.getSuccess()) {
  // success, row was deleted
} else {
  // failure, row either did not exist or conditional delete failed
}

Puede realizar una secuencia de operaciones DeleteRequest en una tabla utilizando la clase MultiDeleteRequest.

Consulte la guía de referencia de API de Java para obtener más información sobre las API.

Las filas únicas se suprimen mediante borneo.DeleteRequest con un valor de clave primaria como se muestra a continuación.
from borneo import DeleteRequest
# DeleteRequest requires table name and primary key
request = DeleteRequest().set_table_name('users') 
request.set_key({'id': 1})
# perform the operation
result = handle.delete(request)
if result.get_success():
# success -- the row was deleted
# if the row didn't exist or was not deleted for any other reason, False is returned

Las operaciones de supresión pueden ser condicionales en función de un valor borneo.Version devuelto de un valor get operation.You puede realizar varias supresiones en una sola operación mediante un rango de valores utilizando borneo.MultiDeleteRequest y borneo.NoSQLHandle.multi_delete().

Las filas únicas se suprimen mediante nosqldb.DeleteRequest con un valor de clave primaria:
key := &types.MapValue{}
key.Put("id", 1)
req := &nosqldb.DeleteRequest{
    TableName: "users",
    Key: key,
}
res, err := client.Delete(req)

Las operaciones de supresión pueden ser condicionales según un valor types.Version devuelto de una operación de obtención.

Para suprimir una fila, utilice el método delete. Transfiera el nombre de la tabla y la clave primaria de la fila que desea suprimir. Además, puede condicionar la operación de supresión especificando en una versión de la fila devuelta previamente por get o put. Puede transferirlo como propiedad matchVersion del argumento opt: { matchVersion: my_version }. También puede utilizar el método deleteIfVersion.

Los métodos delete y deleteIfVersion devuelven Promesa de DeleteResult, que es un objeto JavaScript sin formato, que contiene el estado correcto de la operación.
const NoSQLClient = require('oracle-nosqldb').NoSQLClient;
const client = new NoSQLClient('config.json');

async function deleteRowsFromUsersTable() {
    const tableName = 'users';
    try {
        let result = await client.put(tableName, { id: 1, name: 'John' });

        // Unconditional delete, should succeed
        result = await client.delete(tableName, { id: 1 });
        // Expected output: delete succeeded
        console.log('delete ' + result.success ? 'succeeded' : 'failed');

        // Delete with non-existent primary key, will fail
        result = await client.delete(tableName, { id: 2 });
        // Expected output: delete failed
        console.log('delete ' + result.success ? 'succeeded' : 'failed');

        // Re-insert the row
        result = await client.put(tableName, { id: 1, name: 'John' });
        let version = result.version;

        // Will succeed because the version matches existing row
        result = await client.deleteIfVersion(tableName, { id: 1 }, version);
        // Expected output: deleteIfVersion succeeded
        console.log('deleteIfVersion ' + result.success ?
            'succeeded' : 'failed');

        // Re-insert the row
        result = await client.put(tableName, { id: 1, name: 'John' });

        // Will fail because the last put has changed the row version, so
        // the old version no longer matches.  The result will also contain
        // existing row and its version because we specified returnExisting in
        // the opt argument.
        result = await client.deleteIfVersion(tableName, { id: 1 }, version,
            { returnExisting: true });
        // Expected output: deleteIfVersion failed
        console.log('deleteIfVersion ' + result.success ?
            'succeeded' : 'failed');
        // Expected output: { id: 1, name: 'John' }
        console.log(result.existingRow);
    } catch(error) {
        //handle errors
    }
}

Tenga en cuenta que, de forma similar a las operaciones de colocación, success sólo da como resultado un valor falso si se intenta suprimir una fila con una clave primaria no existente o debido a una discrepancia de versiones al especificar la versión coincidente. Si se produce un fallo por cualquier otro motivo, se producirá un error. Puede suprimir varias filas que tengan la misma clave de partición horizontal en una única operación atómica mediante el método deleteRange. Este método suprime el juego de filas basado en una clave primaria parcial (que debe ser una clave de partición horizontal o su superjuego) y FieldRange opcional que especifica un rango de valores de uno de los otros campos de clave primaria (no incluidos en la clave parcial).

Para suprimir una fila, utilice el método DeleteAsync. Transfiera el nombre de la tabla y la clave primaria de la fila que desea suprimir. Este método toma el valor de clave primaria como MapValue. Los nombres de campo deben ser los mismos que los nombres de columna de clave primaria de tabla. También puede transferir opciones como DeleteOptions. Además, puede condicionar la operación de supresión especificando en un RowVersion de la fila devuelta anteriormente por GetAsync o PutAsync. Utilice el método DeleteIfVersionAsync que toma la versión de fila para que coincida. También puede utilizar el método DeleteAsync y transferir la versión como propiedad MatchVersion de DeleteOptions.
var client = new NoSQLClient("config.json");
var tableName = "users";
try
{
    var row = new MapValue
    {
        ["id"] = 1,
        ["name"] = "John"
    };

    var putResult = await client.PutAsync(tableName, row);
    Console.WriteLine("Put {0}.",
       putResult.Success ? "succeeded" : "failed");

    var primaryKey = new MapValue
    {
        ["id"] = 1
    };
    // Unconditional delete, should succeed.
    var deleteResult = await client.DeleteAsync(tableName, primaryKey);
    // Expected output: Delete succeeded.
    Console.WriteLine("Delete {0}.",
        deleteResult.Success ? "succeeded" : "failed");
    // Delete with non-existent primary key, should fail.
    var deleteResult = await client.DeleteAsync(tableName,
        new MapValue
        {
            ["id"] = 200
        });
    // Expected output: Delete failed.
    Console.WriteLine("Delete {0}.",
        deleteResult.Success ? "succeeded" : "failed");
    // Re-insert the row and get the new row version.
    putResult = await client.PutAsync(tableName, row);
    var version = putResult.Version;
    // Delete should succeed because the version matches existing
    // row.
    deleteResult = await client.DeleteIfVersionAsync(tableName,
        primaryKey, version);
    // Expected output: DeleteIfVersion succeeded.
    Console.WriteLine("DeleteIfVersion {0}.",
        deleteResult.Success ? "succeeded" : "failed");
    // Re-insert the row
    putResult = await client.PutAsync(tableName, row);
    // This delete should fail because the last put operation has
    // changed the row version, so the old version no longer matches.
    // The result will also contain existing row and its version because
    // we specified ReturnExisting in DeleteOptions.
    deleteResult = await client.DeleteIfVersionAsync(tableName,
        primaryKey, version);
    // Expected output: DeleteIfVersion failed.
    Console.WriteLine("DeleteIfVersion {0}.",
        deleteResult.Success ? "succeeded" : "failed");
    // Expected output: { "id": 1, "name": "John" }
    Console.WriteLine(result.existingRow);
}
catch(Exception ex) {
    // handle exceptions
}
Tenga en cuenta que la propiedad Success del resultado solo indica si se ha encontrado la fila que se va a suprimir y para la supresión condicional, si la versión proporcionada coincide. Si la operación de supresión falla por cualquier otro motivo, se devolverá una excepción. Puede suprimir varias filas que tengan la misma clave de partición horizontal en una única operación atómica mediante el método DeleteRangeAsync. Este método suprime el juego de filas basado en la clave primaria parcial (que debe incluir una clave de partición horizontal) y FieldRange opcional que especifica un rango de valores de uno de los otros campos de clave primaria (no incluidos en la clave parcial).
Utilice uno de estos métodos para suprimir las filas de las tablas: NosqlRepository deleteById(), delete(), deleteAll(Iterable<? extends T> entities), deleteAll() o con NosqlTemplate delete(), deleteAll(), deleteById(), deleteInShard(). Para obtener más información, consulte SDK for Spring Data API Reference.
Nota

En primer lugar, cree la clase AppConfig que amplía 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 esta sección, utilice el método NosqlRepository deleteAll() para suprimir las filas de la tabla.

Cree la 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. La interfaz NosqlRepository proporciona métodos que se utilizan para 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> {
    Iterable<Users> findAll();
}
En la aplicación, utilice el método deleteAll() para suprimir las filas existentes de la tabla.
@Autowired
private UsersRepository repo;
 
/* Delete all the existing rows if any, from the Users table.*/
repo.deleteAll();