Mengelola Basis Data
Serupa dengan mesin basis data tradisional, Anda juga dapat membuat basis data di Milvus dan mengalokasikan hak istimewa kepada pengguna tertentu untuk mengelolanya. Kemudian pengguna tersebut memiliki hak untuk mengelola koleksi dalam database. Sebuah cluster Milvus mendukung maksimal 64 basis data.
Cuplikan kode di halaman ini menggunakan modul PyMilvus ORM untuk berinteraksi dengan Milvus. Cuplikan kode dengan MilvusClient SDK yang baru akan segera tersedia.
Membuat basis data
Gunakan connect() untuk terhubung ke server Milvus dan create_database() untuk membuat basis data baru:
Gunakan MilvusClient untuk menyambung ke server Milvus dan createDatabase() untuk membuat database baru:
Gunakan MilvusClient untuk menyambung ke server Milvus dan createDatabase() untuk membuat basis data baru:
from pymilvus import connections, db
conn = connections.connect(host="127.0.0.1", port=19530)
database = db.create_database("my_database")
import io.milvus.client.MilvusServiceClient;
import io.milvus.param.ConnectParam;
import io.milvus.param.collection.CreateDatabaseParam;
// 1. Connect to Milvus server
ConnectParam connectParam = ConnectParam.newBuilder()
.withUri(CLUSTER_ENDPOINT)
.withToken(TOKEN)
.build();
MilvusServiceClient client = new MilvusServiceClient(connectParam);
// 3. Create a new database
CreateDatabaseParam createDatabaseParam = CreateDatabaseParam.newBuilder()
.withDatabaseName("")
.build();
R<RpcStatus> response = client.createDatabase(createDatabaseParam);
const address = "http://localhost:19530";
// 1. Set up a Milvus Client
client = new MilvusClient({ address });
// 3. Create a database
res = await client.createDatabase({
db_name: "my_database",
});
console.log(res);
// {
// error_code: 'Success',
// reason: '',
// code: 0,
// retriable: false,
// detail: ''
// }
Cuplikan kode di atas menyambungkan ke basis data default dan membuat basis data baru bernama my_database
.
Menggunakan basis data
Sebuah klaster Milvus dikirimkan dengan basis data default, bernama 'default'. Koleksi dibuat di dalam basis data default kecuali ditentukan lain.
Untuk mengubah basis data default, lakukan hal berikut:
db.using_database("my_database")
// No equivalent method is available.
// 4. Activate another database
res = await client.useDatabase({
db_name: "my_database",
});
console.log(res);
Anda juga dapat mengatur basis data yang akan digunakan saat terhubung ke klaster Milvus sebagai berikut:
conn = connections.connect(
host="127.0.0.1",
port="19530",
db_name="my_database"
)
ConnectParam connectParam = ConnectParam.newBuilder()
.withDatabaseName("my_database")
.withUri(CLUSTER_ENDPOINT)
.withToken(TOKEN)
.build();
MilvusServiceClient client = new MilvusServiceClient(connectParam);
const address = "http://localhost:19530";
const db_name = "my_database";
// 1. Set up a Milvus Client
client = new MilvusClient({ address, db_name });
Membuat daftar basis data
Untuk menemukan semua basis data yang ada di dalam cluster Milvus Anda, gunakan metode list_database():
Untuk menemukan semua basis data yang ada di dalam cluster Milvus Anda, gunakan metode listDatabases():
Untuk menemukan semua basis data yang ada di dalam cluster Milvus Anda, gunakan metode listDatabases():
db.list_database()
# Output
['default', 'my_database']
import io.milvus.grpc.ListDatabasesResponse;
import io.milvus.param.R;
// 2. List all databases
R<ListDatabasesResponse> listDatabasesResponse = client.listDatabases();
System.out.println(listDatabasesResponse.getData());
// status {
// }
// db_names: "default"
// db_names: "my_database"
// created_timestamp: 1716794498117757990
// created_timestamp: 1716797196479639477
res = await client.listDatabases();
console.log(res.db_names);
// [ 'default', 'my_database' ]
Menghapus basis data
Untuk menghapus basis data, Anda harus menghapus semua koleksinya terlebih dahulu. Jika tidak, pelepasan akan gagal.
Untuk menjatuhkan basis data, gunakan metode drop_database():
Untuk menjatuhkan basis data, gunakan metode dropDatabase():
Untuk menjatuhkan basis data, gunakan metode dropDatabase():
db.drop_database("my_database")
db.list_database()
# Output
['default']
import io.milvus.param.collection.DropDatabaseParam;
DropDatabaseParam dropDatabaseParam = DropDatabaseParam.newBuilder()
.withDatabaseName("my_database")
.build();
response = client.dropDatabase(dropDatabaseParam);
res = await client.dropDatabase({
db_name: "my_database",
});
Menggunakan RBAC dengan basis data
RBAC juga mencakup operasi basis data dan memastikan kompatibilitas ke depan. Kata basis data dalam API Izin (Berikan / Cabut / Daftar Izin) memiliki arti sebagai berikut:
- Jika koneksi Milvus maupun panggilan API Izin tidak menentukan
db_name
, basis data mengacu pada basis data default. - Jika koneksi Milvus menentukan
db_name
, tetapi panggilan API Izin setelahnya tidak, basis data mengacu pada basis data yang namanya ditentukan dalam koneksi Milvus. - Jika panggilan API Izin dilakukan pada koneksi Milvus, dengan atau tanpa
db_name
yang ditentukan, basis data mengacu pada basis data yang namanya ditentukan dalam panggilan API Izin.
Cuplikan kode berikut ini dibagi di antara blok-blok yang terdaftar di bawah ini.
from pymilvus import connections, Role
_URI = "http://localhost:19530"
_TOKEN = "root:Milvus"
_DB_NAME = "default"
def connect_to_milvus(db_name="default"):
print(f"connect to milvus\n")
connections.connect(
uri=_URI,
token=_TOKEN,
db_name=db_name
)
String URI = "http://localhost:19530";
String TOKEN = "root:Milvus";
public class ConnectToMilvus {
private String _dbName = "default";
public newBuilder() {}
public MilvusServiceClient build() {
ConnectParam connectParam = ConnectParam.newBuilder()
.withUri(URI)
.withToken(TOKEN)
.withDatabaseName(_dbNAME)
.build();
return new MilvusServiceClient(connectParam);
}
public newBuilder withDbName(String dbName) {
this._dbName = dbName;
return this;
}
}
const address = "http://localhost:19530";
const token = "root:Milvus";
function connectToMilvus(dbName = "default") {
const client = new MilvusClient({
address,
token,
dbName,
});
return client;
}
Jika koneksi Milvus maupun panggilan Permission API tidak menetapkan
db_name
, basis data merujuk ke basis data default._ROLE_NAME = "test_role" _PRIVILEGE_INSERT = "Insert" connect_to_milvus() role = Role(_ROLE_NAME) role.create() connect_to_milvus() role.grant("Collection", "*", _PRIVILEGE_INSERT) print(role.list_grants()) print(role.list_grant("Collection", "*")) role.revoke("Global", "*", _PRIVILEGE_INSERT)
String ROLE_NAME = "test_role"; String PRIVILEGE_INSERT = "Insert"; MilvusServiceClient client = new ConnectToMilvus().build(); R<RpcStatus> response = client.createRole(CreateRoleParam.newBuilder() .withRoleName(ROLE_NAME) .build()); if (response.getStatus() != R.Status.Success.getCode()) { throw new RuntimeException(response.getMessage()); } response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder() .withRoleName(ROLE_NAME) .withObject("Collection") .withObjectName("*") .withPrivilege(PRIVILEGE_INSERT) .build()); if (response.getStatus() != R.Status.Success.getCode()) { throw new RuntimeException(response.getMessage()); } R<SelectGrantResponse> grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder() .withRoleName(ROLE_NAME) .build()); if (grants.getStatus() != R.Status.Success.getCode()) { throw new RuntimeException(grants.getMessage()); } System.out.println(grants.getData()); grants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder() .withRoleName(ROLE_NAME) .withObject("Collection") .withObjectName("*") .build()); if (grants.getStatus() != R.Status.Success.getCode()) { throw new RuntimeException(grants.getMessage()); } System.out.println(grants.getData()); response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder() .withRoleName(ROLE_NAME) .withObject("Global") .withObjectName("*") .withPrivilege(PRIVILEGE_INSERT) .build()); if (response.getStatus() != R.Status.Success.getCode()) { throw new RuntimeException(response.getMessage()); } response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder() .withRoleName(ROLE_NAME) .withObject("Global") .withObjectName("*") .withPrivilege(PRIVILEGE_INSERT) .build()); if (response.getStatus() != R.Status.Success.getCode()) { throw new RuntimeException(response.getMessage()); }
const ROLE_NAME = "test_role"; const PRIVILEGE_INSERT = "Insert"; const client = connectToMilvus(); async function demo() {} await client.createRole({ roleName: ROLE_NAME, }); const grants = await client.listGrants({ roleName: ROLE_NAME, }); console.log(grants.grants); await client.revokePrivilege({ roleName: ROLE_NAME, object: "Global", objectName: "*", privilege: PRIVILEGE_INSERT, });
Jika koneksi Milvus menetapkan
db_name
, tetapi panggilan API Izin setelahnya tidak, basis data merujuk ke basis data yang namanya ditentukan dalam koneksi Milvus.# NOTE: please make sure the 'foo' db has been created connect_to_milvus(db_name="foo") # This role will have the insert permission of all collections under foo db, # excluding the insert permissions of collections under other dbs role.grant("Collection", "*", _PRIVILEGE_INSERT) print(role.list_grants()) print(role.list_grant("Collection", "*")) role.revoke("Global", "*", _PRIVILEGE_INSERT)
// NOTE: please make sure the 'foo' db has been created MilvusServiceClient client = new ConnectToMilvus().withDbName("foo").build(); // This role will have the insert permission of all collections under foo db, // excluding the insert permissions of collections under other dbs R<RpcStatus> response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder() .withRoleName(ROLE_NAME) .withObject("Collection") .withObjectName("*") .withPrivilege(PRIVILEGE_INSERT) .build()); if (response.getStatus() != R.Status.Success.getCode()) { throw new RuntimeException(response.getMessage()); } R<SelectGrantResponse> grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder() .withRoleName(ROLE_NAME) .build()); if (grants.getStatus() != R.Status.Success.getCode()) { throw new RuntimeException(grants.getMessage()); } System.out.println(grants.getData()); grants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder() .withRoleName(ROLE_NAME) .withObject("Collection") .withObjectName("*") .build()); if (grants.getStatus() != R.Status.Success.getCode()) { throw new RuntimeException(grants.getMessage()); } System.out.println(grants.getData()); response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder() .withRoleName(ROLE_NAME) .withObject("Global") .withObjectName("*") .withPrivilege(PRIVILEGE_INSERT) .build()); if (response.getStatus() != R.Status.Success.getCode()) { throw new RuntimeException(response.getMessage()); }
const client = connectToMilvus("foo"); async function demo() {} await client.createRole({ roleName: ROLE_NAME, }); const grants = await client.listGrants({ roleName: ROLE_NAME, }); console.log(grants.grants); await client.revokePrivilege({ roleName: ROLE_NAME, object: "Global", objectName: "*", privilege: PRIVILEGE_INSERT, });
Jika panggilan API Izin dilakukan pada koneksi Milvus, dengan atau tanpa
db_name
yang ditentukan, basis data merujuk ke basis data yang namanya ditentukan dalam panggilan API Izin.# NOTE: please make sure the 'foo' db has been created db_name = "foo" connect_to_milvus() role.grant("Collection", "*", _PRIVILEGE_INSERT, db_name=db_name) print(role.list_grants(db_name=db_name)) print(role.list_grant("Collection", "*", db_name=db_name)) role.revoke("Global", "*", _PRIVILEGE_INSERT, db_name=db_name)
// NOTE: please make sure the 'foo' db has been created String dbName = "foo"; MilvusServiceClient client = new ConnectToMilvus().build(); R<RpcStatus> response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder() .withRoleName(ROLE_NAME) .withObject("Collection") .withObjectName("*") .withPrivilege(PRIVILEGE_INSERT) .withDatabaseName(dbName) .build()); if (response.getStatus() != R.Status.Success.getCode()) { throw new RuntimeException(response.getMessage()); } R<SelectGrantResponse> grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder() .withRoleName(ROLE_NAME) .withDatabaseName(dbName) .build()); if (grants.getStatus() != R.Status.Success.getCode()) { throw new RuntimeException(grants.getMessage()); } System.out.println(grants.getData()); grants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder() .withRoleName(ROLE_NAME) .withObject("Collection") .withObjectName("*") .withDatabaseName(dbName) .build()); if (grants.getStatus() != R.Status.Success.getCode()) { throw new RuntimeException(grants.getMessage()); } System.out.println(grants.getData()); response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder() .withRoleName(ROLE_NAME) .withObject("Global") .withObjectName("*") .withPrivilege(PRIVILEGE_INSERT) .withDatabaseName(dbName) .build()); if (response.getStatus() != R.Status.Success.getCode()) { throw new RuntimeException(response.getMessage()); }
// The Node.js SDK currently cannot support this case.