إدارة قواعد البيانات
على غرار محركات قواعد البيانات التقليدية، يمكنك أيضًا إنشاء قواعد بيانات في ميلفوس وتخصيص امتيازات لمستخدمين معينين لإدارتها. ثم يحق لهؤلاء المستخدمين إدارة المجموعات في قواعد البيانات. تدعم مجموعة ميلفوس 64 قاعدة بيانات كحد أقصى.
تستخدم مقتطفات التعليمات البرمجية في هذه الصفحة الوحدة النمطية PyMilvus ORM للتفاعل مع Milvus. ستتوفر مقتطفات التعليمات البرمجية مع وحدة MilvusClient SDK الجديدة قريبًا.
إنشاء قاعدة بيانات
استخدم connect() للاتصال بخادم Milvus و create_database() لإنشاء قاعدة بيانات جديدة:
استخدم MilvusClient للاتصال بخادم Milvus وإنشاء قاعدة بيانات() لإنشاء قاعدة بيانات جديدة:
استخدم MilvusClient للاتصال بخادم Milvus وإنشاء قاعدة بيانات() لإنشاء قاعدة بيانات جديدة:
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: ''
// }
تتصل مقتطفات التعليمات البرمجية أعلاه بقاعدة البيانات الافتراضية وتنشئ قاعدة بيانات جديدة باسم my_database
.
استخدام قاعدة بيانات
يتم شحن مجموعة Milvus مع قاعدة بيانات افتراضية، اسمها "افتراضي". يتم إنشاء المجموعات في قاعدة البيانات الافتراضية ما لم يتم تحديد خلاف ذلك.
لتغيير قاعدة البيانات الافتراضية، قم بما يلي:
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);
يمكنك أيضًا تعيين قاعدة بيانات لاستخدامها عند الاتصال بمجموعة ميلفوس الخاصة بك على النحو التالي:
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 });
قائمة قواعد البيانات
للعثور على جميع قواعد البيانات الموجودة في مجموعة ميلفوس الخاصة بك، استخدم طريقة list_database():
للعثور على جميع قواعد البيانات الموجودة في مجموعة ميلفوس الخاصة بك، استخدم طريقة listDatabase():
للعثور على جميع قواعد البيانات الموجودة في مجموعة ميلفوس الخاصة بك، استخدم أسلوب 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' ]
إسقاط قاعدة بيانات
لإسقاط قاعدة بيانات، عليك إسقاط جميع مجموعاتها أولاً. وإلا ستفشل عملية الإسقاط.
لإسقاط قاعدة بيانات، استخدم الأسلوب drop_database():
لإسقاط قاعدة بيانات، استخدم طريقة dropDatabase():
لإسقاط قاعدة بيانات، استخدم طريقة 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",
});
استخدام RBAC مع قاعدة البيانات
يغطي RBAC أيضًا عمليات قاعدة البيانات ويضمن التوافق المستقبلي. كلمة قاعدة البيانات في واجهات برمجة تطبيقات الأذونات (منح / إبطال / قائمة منح) لها المعاني التالية:
- إذا لم يحدد اتصال Milvus أو استدعاء واجهة برمجة تطبيقات الأذونات
db_name
، تشير قاعدة البيانات إلى قاعدة البيانات الافتراضية. - إذا كان اتصال Milvus يحدد
db_name
، ولكن استدعاء واجهة برمجة تطبيقات Permission API بعد ذلك لا يحدد ، تشير قاعدة البيانات إلى قاعدة البيانات التي تم تحديد اسمها في اتصال Milvus. - إذا تم إجراء استدعاء Permission API عند اتصال Milvus، مع أو بدون تحديد
db_name
، تشير قاعدة البيانات إلى قاعدة البيانات التي تم تحديد اسمها في استدعاء واجهة برمجة التطبيقات الخاصة بالإذن.
مقتطف الكود التالي مشترك بين الكتل المدرجة أدناه.
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;
}
إذا لم يحدد اتصال Milvus ولا استدعاء واجهة برمجة تطبيقات الأذونات
db_name
، تشير قاعدة البيانات إلى قاعدة البيانات الافتراضية._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, });
إذا كان اتصال Milvus يحدد
db_name
، ولكن استدعاء واجهة برمجة تطبيقات الأذونات بعد ذلك لا يحدد ، تشير قاعدة البيانات إلى قاعدة البيانات التي تم تحديد اسمها في اتصال 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, });
إذا تم إجراء مكالمة Permission API عند اتصال Milvus، مع تحديد
db_name
أو بدونه، تشير قاعدة البيانات إلى قاعدة البيانات التي تم تحديد اسمها في مكالمة Permission API.# 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.