Проблемы при вставке данных в облачную БД
Я работаю над проектом, в котором я полагаю, чтобы получить некоторый пользовательский ввод через веб-приложение и отправить эти данные в облачную БД. Я использую 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'
Я искал немного, и нашел ниже ссылку на стек в качестве предполагаемого разрешения
TypeError: unhashable тип: 'dict'
В нем говорится: "Чтобы использовать dict в качестве ключа, вам нужно сначала превратить его в нечто, что может быть хешировано. Если dict, который вы хотите использовать в качестве ключа, состоит только из неизменяемых значений, вы можете создать его хешируемое представление следующим образом:
key = frozenset(dict_key.items())"
У меня есть ниже вопросы:
1) Я пытался использовать его в моем коде выше, но я не уверен, правильно ли я его использовал.
2) Чтобы поместить данные в облачную БД, я использую модуль Python "запросы". В коде я использую строку ниже, чтобы поместить данные в БД:
req = requests.put(post_url, auth=auth,headers=headers, data=json.dumps(doc))
Но я получаю ошибку ниже:
"причина": "Только GET,HEAD,POST разрешены"
Я также искал и нашел документ IBM BLuemix об этом следующим образом
https://console.ng.bluemix.net/docs/services/Cloudant/basics/index.html
Поскольку я сослался на документ, я могу сказать, что я использую правильный вариант. Но, может быть, я ошибаюсь.
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
поле указывается в документе и в нижнем регистре- запрос вызова является POST, а не PUT
post_url
содержит имя базы данных, в которую производится запись - в этом случаеmydb
Обратите внимание: в приведенном выше примере я пишу в локальную CouchDB, но замена URL-адреса на ваш Cloudant URL и добавление правильных учетных данных должны помочь вам в этом.