簡體   English   中英

使用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行中失敗:

{“錯誤”:True,“代碼”:400,“錯誤編號”:1208,“錯誤消息”:“名稱必須為非空”}

我可能使用了錯誤的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() 該參數接收字典並將其轉換為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']

如果需要,還可以對有效負載使用字典並將其轉換為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM