データの削除
表から行を削除する方法について学習します。
/* 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
}
MultiDeleteRequest
クラスを使用して、表に対して一連のDeleteRequest
操作を実行できます。
borneo.DeleteRequest
を使用して単一行を削除します。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
削除操作は、get操作から返されたborneo.Version
に基づいて、条件付きにできます。borneo.MultiDeleteRequest
およびborneo.NoSQLHandle.multi_delete()
を使用し、値の範囲を使用して1回の操作で複数の削除を実行できます。
nosqldb.DeleteRequest
を使用して、単一行を削除します。key := &types.MapValue{}
key.Put("id", 1)
req := &nosqldb.DeleteRequest{
TableName: "users",
Key: key,
}
res, err := client.Delete(req)
削除操作は、get操作から返されたtypes.Version
に基づいて条件付きにできます。
行を削除するには、delete
メソッドを使用します。削除する行の表名および主キーを渡します。また、get
またはput
によって以前に返された行のバージョンを指定することで、削除操作を条件付きにできます。これをopt引数{ matchVersion: my_version }
のmatchVersionプロパティとして渡すことができます。または、deleteIfVersion
メソッドを使用することもできます。
delete
およびdeleteIfVersion
メソッドは、操作の成功ステータスを含むプレーンJavaScriptオブジェクトであるDeleteResult
のPromiseを返します。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
}
}
put操作と同様に、success
は、存在しない主キーを持つ行を削除しようとした場合、または一致するバージョンが指定されているときにバージョンが不一致の場合のみ、false値になることに注意してください。その他の理由で失敗するとエラーになります。deleteRange
メソッドを使用して、単一のアトミック操作で同じシャード・キーを持つ複数の行を削除できます。このメソッドは、部分主キー(シャード・キーまたはそのスーパーセットである必要があります)およびオプションのFieldRange
に基づいて行のセットを削除します。このオプションは、一方の(部分キーには含まれない)主キー・フィールドの値の範囲を指定します。
DeleteAsync
メソッドを使用します。削除する行の表名および主キーを渡します。このメソッドは、主キー値をMapValue
として取得します。フィールド名は、表の主キー列名と同じである必要があります。オプションをDeleteOptions
として渡すこともできます。また、以前にGetAsync
またはPutAsync
によって返された行のRowVersion
を指定することで、削除操作を条件付きにできます。照合する行バージョンを取得するDeleteIfVersionAsync
メソッドを使用します。または、DeleteAsync
メソッドを使用して、バージョンをDeleteOptions
のMatchVersion
プロパティとして渡すこともできます。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
}
結果のSuccessプロパティは、削除する行が見つかったかどうか、および条件付き削除について、指定されたバージョンが一致したかどうかのみを示すことに注意してください。その他の理由で削除操作が失敗した場合は、例外がスローされます。DeleteRangeAsync
メソッドを使用して、単一のアトミック操作で同じシャード・キーを持つ複数の行を削除できます。このメソッドは、部分主キー(シャード・キーを含む必要があります)およびオプションのFieldRangeに基づいて行のセットを削除します。このオプションは、一方の(部分キーには含まれない)主キー・フィールドの値の範囲を指定します。