Проблемы при вставке данных в облачную БД

Я работаю над проектом, в котором я полагаю, чтобы получить некоторый пользовательский ввод через веб-приложение и отправить эти данные в облачную БД. Я использую 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 и добавление правильных учетных данных должны помочь вам в этом.

Другие вопросы по тегам