在 cloudant 数据库中插入数据时出现问题
Issues while inserting data in cloudant DB
我正在做一个项目,我想在其中通过 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下面找到link作为预期的解决方案
TypeError: unhashable type: 'dict'
它说“要将 dict 用作键,您需要先将其转换为可以散列的内容。如果您希望用作键的 dict 仅包含不可变值,则可以创建可散列表示像这样:
key = frozenset(dict_key.items())"
我有以下疑问:
1) 我在上面的代码中尝试过使用它,但我不确定我是否正确使用它。
2) 为了将数据放入 cloudant 数据库,我使用了 Python 模块 "requests"。在代码中,我使用以下行将数据放入数据库中:
req = requests.put(post_url, auth=auth,headers=headers, data=json.dumps(doc))
但我遇到以下错误:
"reason": "Only GET,HEAD,POST allowed"
我也搜索了一下,发现 IBM BLuemix 文档如下
https://console.ng.bluemix.net/docs/services/Cloudant/basics/index.html#cloudant-basics
当我参考文档时,我可以说我使用了正确的选项。但也许我错了。
如果您要将文档添加到数据库并且您知道 _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,但是将 URL 替换为您的 Cloudant URL 并添加正确的凭据应该可以为您工作。
我正在做一个项目,我想在其中通过 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下面找到link作为预期的解决方案
TypeError: unhashable type: 'dict'
它说“要将 dict 用作键,您需要先将其转换为可以散列的内容。如果您希望用作键的 dict 仅包含不可变值,则可以创建可散列表示像这样:
key = frozenset(dict_key.items())"
我有以下疑问:
1) 我在上面的代码中尝试过使用它,但我不确定我是否正确使用它。
2) 为了将数据放入 cloudant 数据库,我使用了 Python 模块 "requests"。在代码中,我使用以下行将数据放入数据库中:
req = requests.put(post_url, auth=auth,headers=headers, data=json.dumps(doc))
但我遇到以下错误:
"reason": "Only GET,HEAD,POST allowed"
我也搜索了一下,发现 IBM BLuemix 文档如下
https://console.ng.bluemix.net/docs/services/Cloudant/basics/index.html#cloudant-basics
当我参考文档时,我可以说我使用了正确的选项。但也许我错了。
如果您要将文档添加到数据库并且您知道 _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,但是将 URL 替换为您的 Cloudant URL 并添加正确的凭据应该可以为您工作。