図解で、Cloudant (NoSQL) の Python CRUD, 2021

# 図解で、Cloudant (NoSQL) の Python CRUD
IBM Cloud の mBaaS（NoSQL/ドキュメントデータベース） といえば IBM Cloudant が候補になる。2021年の最新バージョンでの PythonのCRUD（作成/読み込み/更新/削除）サンプルコードを残しておく。

## 動作確認した構成
GCPのLinuxサーバー側で実行するpythonスクリプトが、Cloudantデータベースを編集する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/123186d1-03d4-ed46-4d47-d27dbd811b5b.png)

## Cloudantお薦めの理由
クレジットカード登録不要のライトアカウント（無料）で、WEBアプリ/モバイルアプリのデータベースとして利用できる。その上、マネージドサービスなので、データベースサーバーの準備やインストールが不要で、すぐにDBテーブル作成できる。無料範囲は、スループット性能が1秒あたりの読取数20/書込数10、そして容量上限 1GB。1GBは少ない？サイズが大きな画像ファイルなどは、IBM Object Storage 25GBまで無料を併用し、Cloudantには全角テキスト300文字のドキュメントなら20万件以上保存できる。

## Cloudant ダッシュボード
データベース、ドキュメント、フィールド(JSON)を管理ポータルで操作(作成/変更/削除)できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/1ab304e4-9909-3372-3c0b-b01e95ed167c.png)

## 事前準備（２つ）

事前準備１；IBM Cloud 管理ポータルで「サービス資格情報」を取得する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/9cca8b58-41ab-cfa1-aa65-b26030ff6884.png)

事前準備２；python で cloudant を使うには、cloudant クライアントライブラリーが必要。pipでインストールする。

```
$ pip install cloudant
```

インストールできたか、cloudant=2.3.1の様なバージョンが表示されることを確認する。

```
$ pip freeze
cloudant=2.3.1
```

## python サンプルコード（CRUD）

ライブラリ定義とCloudantアクセス認証

```sample.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import datetime
import os
import sys

from cloudant.client import Cloudant
from cloudant.error import CloudantException
from cloudant.result import Result, ResultByKey

# DBアクセス認証
serviceUsername = "apikey-v2-2v25*********************************ycs6yl4"
servicePassword = "bd2*************************bca6"
serviceURL = "https://apikey-v2-2v25*****-bluemix.cloudantnosqldb.appdomain.cloud"

def mydb_read():
    # データを取得する
    result_collection = Result(myDB_kano.all_docs, include_docs=True)
    for data_json in result_collection:
        print( data_json )

def mydb_append(strTable, strComment):
    # 新しいドキュメントを作成する
    objToday = datetime.datetime.today()
    strTemp = str(objToday.year) + str(objToday.month) + str(objToday.day) \
               + str(objToday.hour) + str(objToday.minute)
    jsonDocument = {
        "_id": ":".join(("docid", strTemp)),
        "table": strTable,
        "comment": strComment
    }
    newDocument = myDB_kano.create_document(jsonDocument)


if __name__ == '__main__':

    # DBに接続する
    client = Cloudant(serviceUsername, servicePassword, url=serviceURL)
    client.connect()
    myDB_kano = client.create_database("first-db")

    print('Cloudant DB操作 メニュー')
    print('[1] 新規ドキュメント作成')
    print('[2] ドキュメント読取')
    print('[3] ドキュメント更新')
    print('[4] ドキュメント削除')
    inputWord = input('>>> ')

    if inputWord == '1':
        inputWord = input('データを入力 > ')
        mydb_append('chat', inputWord)            # DB内のドキュメント書き込み

    elif inputWord == '2':
        mydb_read()                               # DB内のドキュメント読み込み

    elif inputWord == '3':
        inputDocid = input('docidを入力 > ')
        doc_exists = 'docid:' + inputDocid in myDB_kano
        if doc_exists:
            myDoc = myDB_kano[ 'docid:' + inputDocid ]
            inputWord = input('データを入力 > ')
            myDoc['comment'] = inputWord         # DB内のドキュメント変更
            myDoc.save()
        else:
            print('Docid ' + inputDocid + ' は存在しません。')

    elif inputWord == '4':
        inputDocid = input('docidを入力 > ')
        doc_exists = inputDocid in myDB_kano
        if doc_exists:
            myDoc = myDB_kano[ 'docid:' + inputDocid ]
            myDoc.delete()                            # DB内のドキュメント削除
        else:
            print('Docid ' + inputDocid + ' は存在しません。')

```

## 実行例

pythonスクリプトを実行するとメニューが表示されるので、該当するキー入力してenter。

```
$ python3 sample.py
Cloudant DB操作 メニュー
[1] 新規ドキュメント作成
[2] ドキュメント読取
[3] ドキュメント更新
[4] ドキュメント削除
>>> 2
{'id': 'docid:20218132038', 'key': 'docid:20218132038', 'value': {'rev': '2-e36a3b4b73af1ef72ef787ef98e4c22b'}, 'doc': {'_id': 'docid:20218132038', '_rev': '2-e36a3b4b73af1ef72ef787ef98e4c22b', 'table': 'chat', 'comment': 'データを書き替えする。これに。'}}
{'id': 'docid:2021814022', 'key': 'docid:2021814022', 'value': {'rev': '1-513c708d536ab8247d677902898e241c'}, 'doc': {'_id': 'docid:2021814022', '_rev': '1-513c708d536ab8247d677902898e241c', 'table': 'chat', 'comment': '最初のデータ（ドキュメント）を追加する'}}

```

## まとめ

- IBM Cloud の mBaaS（NoSQL/ドキュメントデータベース） 候補は Cloudant 。
- 2021時点 PythonのCRUD（作成/読み込み/更新/削除）サンプルコードを記載。
- お薦め：クレジットカード登録不要で、WEBアプリのデータベースとして利用できるぞ。

### Cloudantダッシュボードで、クレデンシャルを再要求された場合

一定時間操作しないと、ユーザ名とパスワードを要求される場合がある。Cloudantダッシュボードにログインする場合は、IBM Cloud 管理ポータルのサービス資格情報のユーザ名とパスワードを入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/2fc84cd4-1ccd-8c53-ee2b-bfd864eb2e59.png)