使用 pyArango 重命名集合

Rename collection with 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 must be non-empty'}

我可能错误地使用了 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 的字典。此对象作为命名参数 params 传递给请求函数 fct()。此参数接收 dict 并将其转换为 URL 路径参数,例如?name=newname 服务器的 HTTP API 不支持。

很遗憾,无法通过 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']

如果需要,您还可以使用字典作为有效负载并将其转换为 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