【问题标题】:Issues while inserting data in cloudant DB在 cloudant DB 中插入数据时出现问题
【发布时间】:2017-10-04 18:42:02
【问题描述】:

我正在做一个项目,我想通过 Web 应用程序获取一些用户输入,并将该数据发送到 cloudant DB。我将python用于用例。下面是示例代码:

import requests
import json


dict_key ={}
key = frozenset(dict_key.items())   
doc={
{
    "_ID":"1",
    "COORD1":"1,1",
    "COORD2":"1,2",
    "COORD3":"2,1",
    "COORD4":"2,2",
    "AREA":"1",
    "ONAME":"abc",
    "STYPE":"black",
    "CROPNAME":"paddy",
    "CROPPHASE":"initial",
    "CROPSTARTDATE":"01-01-2017",
    "CROPTYPE":"temp",
    "CROPTITLE":"rice",
    "HREADYDATE":"06-03-2017",
    "CROPPRICE":"1000",
    "WATERRQ":"1000",
    "WATERSRC":"borewell"

        }
}


auth = ('uid', 'pwd')
headers = {'Content-type': 'application/json'}

post_url = "server_IP".format(auth[0])

req = requests.put(post_url,  auth=auth,headers=headers,  data=json.dumps(doc))
#req =  requests.get(post_url, auth=auth)
print json.dumps(req.json(), indent=1)

当我运行代码时,我收到以下错误:

     "WATERSRC":"borewell"
TypeError: unhashable type: 'dict'

我搜索了一下,发现下面的 stackflow 链接作为一个预期的解决方案

TypeError: unhashable type: 'dict'

它说“要使用 dict 作为键,您需要先将其转换为可以被散列的东西。如果您希望用作键的 dict 仅包含不可变值,您可以创建它的可散列表示像这样:

key = frozenset(dict_key.items())"

我有以下疑问:

1) 我已经尝试在上面的代码中使用它,但我不确定我是否正确使用它。

2) 要将数据放入 cloudant 数据库,我使用的是 Python 模块“请求”。在代码中,我使用以下行将数据放入数据库中:

req = requests.put(post_url,  auth=auth,headers=headers,  data=json.dumps(doc))

但我遇到以下错误:

“原因”:“只允许 GET、HEAD、POST”

我也对此进行了搜索,发现 IBM BLuemix 文档如下

https://console.ng.bluemix.net/docs/services/Cloudant/basics/index.html#cloudant-basics

当我提到文档时,我可以说我使用了正确的选项。但也许我错了。

【问题讨论】:

    标签: python python-2.7 cloudant python-cloudant


    【解决方案1】:

    如果您正在向数据库添加文档并且您知道_id,那么您需要执行 HTTP POST。这是一些稍微修改的代码:

    import requests
    import json
    
    doc={
        "_id":"2",
        "COORD1":"1,1",
        "COORD2":"1,2",
        "COORD3":"2,1",
        "COORD4":"2,2",
        "AREA":"1",
        "ONAME":"abc",
        "STYPE":"black",
        "CROPNAME":"paddy",
        "CROPPHASE":"initial",
        "CROPSTARTDATE":"01-01-2017",
        "CROPTYPE":"temp",
        "CROPTITLE":"rice",
        "HREADYDATE":"06-03-2017",
        "CROPPRICE":"1000",
        "WATERRQ":"1000",
        "WATERSRC":"borewell"
    }
    
    auth = ('admin', 'admin')
    headers = {'Content-type': 'application/json'}
    post_url = 'http://localhost:5984/mydb'
    req = requests.post(post_url,  auth=auth,headers=headers,  data=json.dumps(doc))
    print json.dumps(req.json(), indent=1)
    

    注意

    • _id 字段在文档中提供并且是小写的
    • 请求调用是 POST 而不是 PUT
    • post_url 包含正在写入的数据库的名称 - 在本例中为 mydb

    在上面的示例中,我正在写信给本地 CouchDB,但是用您的 Cloudant URL 替换该 URL 并添加正确的凭据应该可以为您工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 2020-12-25
      相关资源
      最近更新 更多