0からpythonでmongoDBAtlas接続~CRUDまで実装

mongoDB Atlas を pythonでつなげて、CRUDの作成までをひとまとめにしている記事はなかなかありませんでした。

今回、mongoDBは初タッチから始めました。なので、いろいろなところから試行錯誤して実装しました。

mongoDBの接続~CRUD実装までを、この記事だけで完結できるようにまとめました。

自分が失敗したところも含めて、これからpythonでmongoDB Atlasを使おうと思っている人の、参考になれればと思います。

mongoDB Atlas とは

mongoDB のクラウド版です。

クラウド版には次のような利点があります。

  1. 無料枠がある(5GBまで)
  2. ソフトウェアをインストールしなくてよい。
  3. ダッシュボードが見やすい

postgreSQL や、MySQLの無料枠はあまり多くないですが、mongoDBAtlasの無料枠は5GBまで使えるので結構使い勝手がよさそうです。

また、ソフトウェアをいろいろインストールしなくてもいいのが使いやすいポイントだと思います。

今回も、まったくインストールなどはせずDBに接続することができました。

これは、試しに作ってみたときのデータベースですが、アクセス数や容量も一目で把握することができます。

mongoDBで出てくる用語

mongoDBでは専用の用語があります。以下にRDBの用語の比較を示します。

mongoDBRDB
データベースデータベース
コレクションテーブル
ドキュメント行(レコード)
フィールド

mongoDB Atlas 登録

では、mongoDB Atlasを登録していきます。

mongoDB のAtlasを選択
アカウント情報を入力

Create your Atlas Account でアカウントを作成します。

メールアドレスを認証する

登録したメールアドレスに、認証メールが届きますので、認証します。

データベースを作成

登録したメールアドレスとパスワードでサインインします。

すると、あなたの管理画面に遷移します。

ここからデータベースを作成していきましょう!「Builed a Database 」を押下しましょう。

プランを選択する

プランを選択できるので、選択しましょう。

今回自分は無料プランで実施します。

クラウドの場所を選ぶことができます。

特にどこにしたいという意思がなければ、最初の設定のまま(AWS , Tokyo)でよいでしょう。

「Create Cluster 」を押します。

ユーザー情報の設定とIPアドレスの許可

ここで入力した「password」は後で使います!必ずメモしておきましょう!!

また、IPアドレスも指定します。

「0.0.0.0」を指定すれば、全てのアクセスを許可します。

以上でmongpoDBの登録が完了しました。

mongoDB Atlasと接続(mongoDB側)

次に、mongoDB Atlasと接続する手順です。

「Connect」ボタンを押下します。

Connect URLの取得

今回はpythonとつなげるので、「Connect your application」を選択します。

今回は、「Python 」「3.6 or later」を選択しました。

また、表示してあるURLをコピーしておきます。

なお、<password>は先ほど入力したpasswordに置き換えておきましょう。

このURLがmongoDBとの接続用に用いられます。

ここまでで、mongoDB側での設定は終了です。

次は、pythonのコードを編集していきます。

mongoDB Atlasと接続(python側)

ここから、python側のコードを準備します。まずは、以下のコードを入力してください。

from flask import Flask,jsonify, request
import pymongo

connection_url = '<!---ここにコピーしたURLを貼り付け----->'
#passwordを書き換え忘れないように注意!!

app = Flask(__name__)
client = pymongo.MongoClient(connection_url)

# "Example"という名前のデータベースを指定
Database = client.get_database('Example')
# "SampleTable"というテーブルを指定
SampleTable = Database.SampleTable

<!----ここにCRUD文を入れる---->

if __name__ == '__main__':
    app.run(debug=True)

これで、接続はできているのですが、まだデータは挿入できていないので、mongoDBのDashBoardを見ても何も出てこないでしょう。

これから、データを入れていくとデータが表示されるはずです。

CRUD実装

Create

from flask import Flask,jsonify, request
import pymongo


connection_url = '<!---ここにコピーしたURLを貼り付け----->'
#passwordを書き換え忘れないように注意!!

app = Flask(__name__)
client = pymongo.MongoClient(connection_url)

# Database
Database = client.get_database('Example')
# Table
SampleTable = Database.SampleTable

@app.route('/insert-one/<name>/<id>/', methods=['GET'])
def insertOne(name, id):
    queryObject = {
        'Name': name,
        'ID': id
    }
    query = SampleTable.insert_one(queryObject)
    print("ok")
    return "Query inserted...!!!"

if __name__ == '__main__':
    app.run(debug=True)

insert_oneコマンドでデータを挿入します。

ここで挿入すると、mongoDB上でデータが表示されるので確認してみてください。

Research

@app.route('/find-one/<argument>/<value>/', methods=['GET'])
def findOne(argument, value):
    queryObject = {argument: value}
    query = SampleTable.find_one(queryObject)
    query.pop('_id')
    return jsonify(query)

find_oneコマンドでは、条件に合ったデータの中の一番上のものを検索してきます。

あべべ

ちなみに、find_oneコマンドでの戻り値は、dict型で返されますが、この後解説するfindコマンドは、pymongo.cursor.Cursor型で返されます。

私はここに気づかず、なんでだー!と時間をとられてしまいました。。。

@app.route('/find/<argument>/<value>/', methods=['GET'])
def find(argument, value):
    queryObject = {argument: value}
    query = SampleTable.find(queryObject)
    print(query)
    output = {}
    for x in query:
        output = x
        output.pop('_id')
    return jsonify(output)

findコマンドを用いると、条件に当てはまるデータを全て取得します。

ちなみに、pymongo.cursor.Cursor型は、for文を用いることによって解消できます。

あべべ

他にも取り出し方はいくつかあるので、興味のある方は調べてみてください!!

Update

@app.route('/update/<key>/<value>/<element>/<updateValue>/', methods=['GET'])
def update(key, value, element, updateValue):
    queryObject = {key: value}
    updateObject = {element: updateValue}
    query = SampleTable.update_one(queryObject, {'$set': updateObject})
    if query.acknowledged:
        return "Update Successful"
    else:
        return "Update Unsuccessful"

update_oneコマンドは、変更したいキーを{key : value}で指定し、変更する対象を{element : updateValue}に入れます。

Delete

@app.route('/delete/<argument>/<value>/', methods=['GET'])
def remove(argument,value):
    queryObject = {argument: value}
    SampleTable.delete_one(queryObject)
    return "remove succesfully"

delete_oneで、同様に条件を指定することで対象を削除することができます。

全コード

以下に全コードを載せておきます。

ここから展開
from flask import Flask,jsonify, request
import pymongo

connection_url = '<!---ここにコピーしたURLを貼り付け----->'
#passwordを書き換え忘れないように注意!!

app = Flask(__name__)
client = pymongo.MongoClient(connection_url)

# Database
Database = client.get_database('Example')
# Table
SampleTable = Database.SampleTable

@app.route('/insert-one/<name>/<id>/', methods=['GET'])
def insertOne(name, id):
    queryObject = {
        'Name': name,
        'ID': id
    }
    query = SampleTable.insert_one(queryObject)
    print("ok")
    return "Query inserted...!!!"

@app.route('/find-one/<argument>/<value>/', methods=['GET'])
def findOne(argument, value):
    queryObject = {argument: value}
    query = SampleTable.find_one(queryObject)
    print(query)
    query.pop('_id')
    print(query)
    return jsonify(query)


@app.route('/find/<argument>/<value>/', methods=['GET'])
def find(argument, value):
    queryObject = {argument: value}
    query = SampleTable.find(queryObject)
    print(query)
    output = {}
    for x in query:
        output = x
        output.pop('_id')
    return jsonify(output)

@app.route('/findall/', methods=['GET'])
def findAll():
    query = SampleTable.find()
    print(query)
    output = {}
    i = 0
    for x in query:
        output[i] = x
        output[i].pop('_id')
        i += 1
        print(x)
    print(output)
    return jsonify(output)

@app.route('/update/<key>/<value>/<element>/<updateValue>/', methods=['GET'])
def update(key, value, element, updateValue):
    queryObject = {key: value}
    updateObject = {element: updateValue}
    query = SampleTable.update_one(queryObject, {'$set': updateObject})
    if query.acknowledged:
        return "Update Successful"
    else:
        return "Update Unsuccessful"

@app.route('/delete/<argument>/<value>/', methods=['GET'])
def remove(argument,value):
    queryObject = {argument: value}
    SampleTable.delete_one(queryObject)
    return "remove succesfully"
  



if __name__ == '__main__':
    app.run(debug=True)

まとめ

今回はmongoDBとの接続~CRUDの実装までを解説しました。

以下では私がプログラミングを継続して学べたコツを紹介しています。
こちらの記事もぜひ併せて読んでみてください。

(Visited 32 times, 1 visits today)