データの削除
表から行を削除する方法について学習します。
/* 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に基づいて行のセットを削除します。このオプションは、一方の(部分キーには含まれない)主キー・フィールドの値の範囲を指定します。
NosqlRepository deleteById()
、delete()
、deleteAll(Iterable<? extends T> entities)
、deleteAll()
またはNosqlTemplate delete()
、deleteAll()
、deleteById()
、deleteInShard()
を使用します。詳細は、SDK for Spring Data APIリファレンスを参照してください。
ノート:
まず、Oracle NoSQL Databaseの接続詳細を指定するために、AbstractNosqlConfiguration
クラスを拡張するAppConfig
クラスを作成します。詳細は、「NoSQL接続の取得」を参照してください。
この項では、NosqlRepository deleteAll()
メソッドを使用して表から行を削除します。
UsersRepository
インタフェースを作成します。このインタフェースは、NosqlRepository
インタフェースを拡張して、そのクラスの主キーのエンティティ・クラスとデータ型をパラメータ化された型としてNosqlRepository
インタフェースに提供します。NosqlRepository
インタフェースは、データベースからデータを取得するために使用されるメソッドを備えています。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();
}
deleteAll()
メソッドを使用して、表から既存の行を削除します。@Autowired
private UsersRepository repo;
/* Delete all the existing rows if any, from the Users table.*/
repo.deleteAll();