Gestionar bases de datos
De forma similar a los motores de bases de datos tradicionales, también puede crear bases de datos en Milvus y asignar privilegios a determinados usuarios para gestionarlas. Entonces dichos usuarios tienen derecho a gestionar las colecciones de las bases de datos. Un cluster Milvus soporta un máximo de 64 bases de datos.
Los fragmentos de código de esta página utilizan el módulo PyMilvus ORM para interactuar con Milvus. Pronto estarán disponibles fragmentos de código con el nuevo SDK MilvusClient.
Crear base de datos
Utilice connect() para conectarse al servidor Milvus y create_database() para crear una nueva base de datos:
Utilice MilvusClient para conectarse al servidor Milvus y createDatabase() para crear una nueva base de datos:
Utilice MilvusClient para conectarse al servidor Milvus y createDatabase() para crear una nueva base de datos:
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: ''
// }
Los fragmentos de código anteriores se conectan a la base de datos por defecto y crean una nueva base de datos llamada my_database
.
Utilizar una base de datos
Un cluster Milvus se entrega con una base de datos por defecto, llamada 'default'. Las colecciones se crean en la base de datos por defecto a menos que se especifique lo contrario.
Para cambiar la base de datos por defecto, haga lo siguiente:
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);
También puede establecer una base de datos para utilizar al conectarse a su cluster Milvus de la siguiente manera:
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 });
Lista de bases de datos
Para encontrar todas las bases de datos existentes en su cluster Milvus, utilice el método list_database():
Para encontrar todas las bases de datos existentes en su cluster Milvus, utilice el método listDatabases():
Para encontrar todas las bases de datos existentes en su cluster Milvus, utilice el método 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' ]
Eliminar base de datos
Para eliminar una base de datos, primero debe eliminar todas sus colecciones. De lo contrario, la eliminación fallará.
Para eliminar una base de datos, utiliza el método drop_database():
Para eliminar una base de datos, utiliza el método dropDatabase():
Para eliminar una base de datos, utiliza el método 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",
});
Utilizar RBAC con la base de datos
RBAC también cubre las operaciones con bases de datos y garantiza la compatibilidad futura. La palabra base de datos en las APIs de Permisos (Conceder / Revocar / Conceder Lista) tiene los siguientes significados:
- Si ni una conexión Milvus ni una llamada a la API de permisos especifica una
db_name
, base de datos se refiere a la base de datos predeterminada. - Si una conexión Milvus especifica un
db_name
, pero una llamada a la API de permisos posterior no lo hace, la base de datos se refiere a la base de datos cuyo nombre se especificó en la conexión Milvus. - Si se realiza una llamada a la API de permisos sobre una conexión Milvus, con o sin
db_name
especificado, la base de datos se refiere a la base de datos cuyo nombre se especificó en la llamada a la API de permisos.
El siguiente fragmento de código se comparte entre los bloques enumerados a continuación.
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;
}
Si ni una conexión Milvus ni una llamada a la API de Permisos especifica un
db_name
, la base de datos se refiere a la base de datos por defecto._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, });
Si una conexión Milvus especifica un
db_name
, pero una llamada posterior a la API de Permisos no lo hace, la base de datos se refiere a la base de datos cuyo nombre fue especificado en la conexión 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, });
Si se realiza una llamada a la API de permisos sobre una conexión Milvus, con o sin
db_name
especificado, la base de datos se refiere a la base de datos cuyo nombre se especificó en la llamada a la API de permisos.# 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.