2018年9月21日金曜日

IBM Cloud上でCloudantを使ってみた!(後編)

前回、ローカルからCloudantデータベースにアクセスしました。
今回は、WebAPIでCloudantを使ってみます。


@app.route('/api/adduser', methods = ['POST'])
def AddUser():

    if request.is_json:
        if 'user' not in request.json:
            user = ''
        else:
            user = str(request.json['user'])

        client = Cloudant('d.....', 'a.....', url='https://d.....')
        client.connect()

        my_database = client['users']

        if user not in my_database:
            my_database.create_document({'_id' : user})

        client.disconnect()

        return jsonify(status = 'success')
    else:
        return jsonify(status = 'error')


{"user":"Taro"}というデータを2回送信したところ、1回目は登録され、2回目にエラーが発生しました。


requests.exceptions.HTTPError: 409 Client Error: Conflict conflict Document update conflict. for url:https://.....


デバッグ用コードを入れ、いろいろ試してみたところ、どうも存在チェックが正常に動作していないようです。
存在チェック前に全データを出力する処理を入れるとなぜだかうまくいきました。


@app.route('/api/adduser', methods = ['POST'])
def AddUser():

    if request.is_json:
        if 'user' not in request.json:
            user = ''
        else:
            user = str(request.json['user'])

        client = Cloudant('d.....', 'a.....', url='https://d.....')
        client.connect()

        my_database = client['users']

        #########################################
        # usersの全データを出力
        for doc in my_database:
            print(doc)
        #########################################

        if user not in my_database:
            my_database.create_document({'_id' : user})

        client.disconnect()

        return jsonify(status = 'success')
    else:
        return jsonify(status = 'error')


使用したpython-cloudantのバージョンは2.3.1でした。
どうやらpython-cloudantのバグのようで、少なくとも2.9.0ではこの問題は修正されていました。

またいつか、どこかで。

2 件のコメント: