【问题标题】:Rename collection with pyArango使用 pyArango 重命名集合
【发布时间】:2018-07-16 12:49:58
【问题描述】:

我正在尝试使用 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 方法,但文档没有提供任何示例。有人有想法吗?

【问题讨论】:

    标签: python arangodb pyarango


    【解决方案1】:

    一个 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']
    

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

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

    【讨论】:

      【解决方案2】:

      我已经这样解决了:

      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
      

      【讨论】:

        猜你喜欢
        • 2015-04-01
        • 2018-08-01
        • 1970-01-01
        • 2021-06-11
        • 2021-04-09
        • 2017-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多