使用pyArango重命名集合



我正在尝试使用pyArango重命名ArangoDB集合。这就是我目前所拥有的:

connection = pyArango.Connection('http://random-address', username='random-username', password='random-password')
test_db = Database(connection, 'test-db')
collection = test_db["new"]
collection.action("PUT", "rename", name="newname")

代码在第4行失败:

{'error':True,'code':400,'errorNum':1208,'errorMessage':'name必须为非空"}

我可能错误地使用了action方法,但文档中没有提供任何示例。有人有主意吗?

需要将JSON对象{"name": "newname"}作为请求体传递。无法将新名称作为URL路径参数传递。问题在于collection.action():的实现

def action(self, method, action, **params) :
"a generic fct for interacting everything that doesn't have an assigned fct"
fct = getattr(self.connection.session, method.lower())
r = fct(self.URL + "/" + action, params = params)
return r.json()

关键字自变量最终成为一个名为params的dict。该对象作为命名参数params被传递给请求函数fct()。该参数接收dict并将其转换为URL路径参数,例如服务器的HTTP API不支持的?name=newname

不幸的是,没有办法通过action()传递有效载荷。然而,您可以编写一些自定义代码:

from pyArango.connection import *
connection = Connection('http://localhost:8529', username='root', password='')
try:
connection.createDatabase('test-db')
except CreationError:
pass
test_db = Database(connection, 'test-db')
try:
test_db.createCollection(name='new')
except CreationError:
pass
collection = test_db['new']
r = connection.session.put(collection.URL + '/rename', data='{"name":"newname"}')
print(r.text)
collection = test_db['newname']

如果需要,您还可以使用dict作为有效负载,并将其转换为JSON:

import json
...put(..., data=json.dumps({"name": "newname"}))

我这样修复了它:

def rename_collection(arango_uri, username, password, database, collection, new_name):
url = '{}/_db/{}/_api/collection/{}/rename'.format(arango_uri, database, collection)
params = {"name": new_name}
response = requests.put(url, data=json.dumps(params), auth=HTTPBasicAuth(username, password))
return response

最新更新