pythonpython-2.7cloudantpython-cloudant

Issues while inserting data in cloudant DB


I am working a project, where in I am suppose to get some user input through web application, and send that data to cloudant DB. I am using python for the use case. Below is the sample code:

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)

When I am running the code, I am getting the below error:

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

I searched a bit, and found below stackflow link as a prospective resolution

TypeError: unhashable type: 'dict'

It says that "To use a dict as a key you need to turn it into something that may be hashed first. If the dict you wish to use as key consists of only immutable values, you can create a hashable representation of it like this:

key = frozenset(dict_key.items())"

I have below queries:

1) I have tried using it in my code above,but I am not sure if I have used it correctly.

2) To put the data in the cloudant DB, I am using Python module "requests". In the code, I am using the below line to put the data in the DB:

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

But I am getting below error:

"reason": "Only GET,HEAD,POST allowed"

I searched on that as well, and I found IBM BLuemix document about it as follows

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

As I referred the document, I can say that I am using the right option. But may be I am wrong.


Solution

  • If you are adding a document to the database and you know the the _id, then you need to do an HTTP POST. Here's some slightly modified code:

    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)
    

    Notice that

    N.B in the above example I am writing to local CouchDB, but replacing the URL with your Cloudant URL and adding correct credentials should get this working for you.