2017-05-06 88 views
0

我正在开发一个项目,我想通过Web应用程序获取一些用户输入,并将该数据发送到云数据库。我使用python的使用case.Below是示例代码::将数据插入云数据库时的问题

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链接作为一个潜在的分辨率

http://stackoverflow.com/questions/13264511/typeerror-unhashable-type-dict 

它说,“要使用字典,因为你需要把它变成的东西,可以首先散列的关键。如果字典你想关键在于使用只有不可变的值,你可以创建它像这样的哈希的表示:

key = frozenset(dict_key.items())" 

我有如下疑问::

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

2)要将数据放入云数据库,我使用Python模块“请求”。在代码中,我使用下面的线把数据在DB:

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 

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

回答

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字段在doc提供,并可由下壳体
  • 请求呼叫是POST不是PUT
  • post_url包含正在写入的数据库的名称 - 在此情况下为mydb

在上面的示例中,我写入本地CouchDB的N.B,但用您的Cloudant URL替换URL并添加正确的凭据应该会为您工作。