2017-05-06 5 views
0

Ich arbeite ein Projekt, in dem ich einige Benutzereingabe durch Web-Anwendung erhalten soll, und diese Daten an Cloudant DB senden. Ich benutze Python für die Verwendung case.Below ist der Beispielcode ::Probleme beim Einfügen von Daten in cloudant DB

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) 

Wenn ich den Code laufen lasse, ich bin der unten Fehler Geting ::

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

ich etwas gesucht, und unter stackflow Link als Interessent Auflösung gefunden

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

er sagt, dass „um einen dict als Schlüssel zu verwenden, müssen Sie es in etwas zu verwandeln, die erste gehasht werden kann. Wenn die dict Sie verwenden möchten, als Schlüssel besteht von nur unveränderlichen Werten, Sie können eine hashable Darstellung es wie folgt erstellen:

key = frozenset(dict_key.items())" 

ich unten Rückfragen ::

1) Ich habe versucht, über sie in meinem Code verwenden, aber ich bin nicht sicher, ob ich es benutzt haben korrekt.

2) Um die Daten in die Cloudant DB zu setzen, verwende ich Python Modul "Anfragen". Im Code verwende ich die unten Linie, die die Daten in der DB zu setzen:

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

Aber ich bin unten Störung zu erhalten:

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

ich auf dem gesuchten als gut, und ich fand IBM Bluemix Dokument darüber wie folgt

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

als ich das Dokument bezeichnen, kann ich sagen, dass ich die richtige Wahl verwenden. Aber vielleicht liege ich falsch.

Antwort

1

Wenn Sie der Datenbank ein Dokument hinzufügen und Sie die _id kennen, müssen Sie einen HTTP-POST durchführen. Hier einige leicht modifizierte 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) 

Beachten Sie, dass

  • das _id Feld im doc geliefert wird und Kleinschreibung
  • die Anforderung Anruf ist ein POST kein PUT
  • die post_url enthält den Namen der Datenbank, in die geschrieben wird - in diesem Fall mydb

N.B im obigen Beispiel schreibe ich auf lokale CouchDB, aber das Ersetzen der URL mit Ihrer Cloudant URL und das Hinzufügen korrekter Zugangsdaten sollte das für Sie arbeiten lassen.

Verwandte Themen