在cloudant DB中插入数据时出现问题

时间:2017-05-06 10:19:01

标签: python python-2.7 cloudant python-cloudant

我正在开展一个项目,我希望通过Web应用程序获取一些用户输入,并将该数据发送到云端数据库。我正在使用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模块“请求”。在代码中,我使用以下行将数据放入DB:

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

但我收到以下错误:

  

“reason”:“只允许GET,HEAD,POST”

我也搜索了这个,我发现了IBM BLuemix文档,如下所示

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

正如我提到的那样,我可以说我正在使用正确的选项。但可能是我错了。

1 个答案:

答案 0 :(得分: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

以上示例中的N.B我写信给本地CouchDB,但是用您的Cloudant URL替换URL并添加正确的凭据应该让这个适用于您。