2017-05-06 87 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並添加正確的憑據應該會爲您工作。