Python/FlaskからMongoDBを扱うpymongo勉強内容メモ
Flaskについて調べていると、けっこうMongoDBを使っている人が多かった気がします。特にpymongoとFlaskとの相性がいいらしい。スキーマレスで柔軟にデータを管理できたり、pythonの辞書型そのまま格納できる点が便利らしい。
MongoDBと会話してみる
まずはHomebrewでインストールして指示に従う。
$ brew install mongodb $ ln -sfv /usr/local/opt/mongodb/*.plist ~/Library/LaunchAgents $ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist $ mongod --config /usr/local/etc/mongod.conf $ mongo --version MongoDB shell version: 2.4.9
上記サイトにのっているのをやってみた。ちゃんと勉強するならドットインストールのレッスンをひと通り見たらいいと思う。
$ mongo > use examDB > db.Math.insert({Name : "Taro", Grade: "40"}) > db.Math.insert({Name : "Jiro", Grade: "100"}) > db.Math.insert({Name : "Saburo", Grade: "90"}) > db.English.insert({Name : "Taro"}) > db.English.insert({Name : "Jiro", Grade: "80"}) > db.English.insert({Name : "Saburo", Grade:"70"}) > db.Math.find() { "_id" : ObjectId("53311bde8009ff889a354064"), "Name" : "Taro", "Grade" : "40" } { "_id" : ObjectId("53311be48009ff889a354065"), "Name" : "Jiro", "Grade" : "100" } { "_id" : ObjectId("53311bea8009ff889a354066"), "Name" : "Saburo", "Grade" : "90" } > db.English.find() { "_id" : ObjectId("53311c0e8009ff889a354067"), "Name" : "Taro" } { "_id" : ObjectId("53311c0e8009ff889a354068"), "Name" : "Jiro", "Grade" : "80" } { "_id" : ObjectId("53311c108009ff889a354069"), "Name" : "Saburo", "Grade" : "70" } > exit bye
なるほど。触ってみるとこちらで解説されてる説明
mongodbの構成は、すっごく簡単に言うと
db - collection - {key1:value1, key2, value2, "_id":ObjcetId("~")} のJSONカラム(ObjectIdは自動生成される)
が何となく分かる。
この例では,
- データベース:examDB
- コレクション:Math, English
- ドキュメント:名前と点数
その他、気づいたこと・役立ちそうなこと
- MongoDBではテーブルのことをコレクションというらしい。
- ObjectIDというのが 各ドキュメントに自動で割り当てられるらしい。
- データはJSON形式(辞書型のようにKeyとValueの関係)で保持されるらしい。
- コレクションを作らないとデータベースは作成されない。
mongodbコマンド
- 一覧の表示:
> show dbs
- 新規作成・切り替え:
> use (DB名)
- 削除:
> use (DB名) -> db.dropDatabase()
pythonからMongoDBを触ってみる
pythonからmongodb使うならpymongo使うそうです。
$ pip install pymongo $ ipython In [1]: from pymongo import MongoClient In [2]: client = MongoClient() In [3]: db = client['examDB'] In [4]: db.Math.insert({'Name' : 'Taro', 'Grade':'40'}) Out[4]: ObjectId('53311d34c1579418640f4149') In [5]: db.Math.insert({'Name' : 'Jiro', 'Grade': '100'}) Out[5]: ObjectId('53311d34c1579418640f414a') In [6]: db.Math.insert({'Name' : 'Saburo', 'Grade': '90'}) Out[6]: ObjectId('53311d36c1579418640f414b') In [7]: db.English.insert({'Name' : 'Taro'}) Out[7]: ObjectId('53311d40c1579418640f414c') In [8]: db.English.insert({'Name' : 'Jiro', 'Grade': '80'}) Out[8]: ObjectId('53311d40c1579418640f414d') In [9]: db.English.insert({'Name' : 'Saburo', 'Grade':'70'}) Out[9]: ObjectId('53311d41c1579418640f414e') In [10]: for data in db.Math.find(): ....: print(data) ....: {u'Grade': u'40', u'_id': ObjectId('53311bde8009ff889a354064'), u'Name': u'Taro'} {u'Grade': u'100', u'_id': ObjectId('53311be48009ff889a354065'), u'Name': u'Jiro'} {u'Grade': u'90', u'_id': ObjectId('53311bea8009ff889a354066'), u'Name': u'Saburo'} {u'Grade': u'40', u'_id': ObjectId('53311d34c1579418640f4149'), u'Name': u'Taro'} {u'Grade': u'100', u'_id': ObjectId('53311d34c1579418640f414a'), u'Name': u'Jiro'} {u'Grade': u'90', u'_id': ObjectId('53311d36c1579418640f414b'), u'Name': u'Saburo'} In [11]: for data in db.Math.find({'Name':'Taro'}): ....: print(data) ....: {u'Grade': u'40', u'_id': ObjectId('53311bde8009ff889a354064'), u'Name': u'Taro'} {u'Grade': u'40', u'_id': ObjectId('53311d34c1579418640f4149'), u'Name': u'Taro'} In [12]: exit()
なるほど。なんとなく使い方は分かった。
参考
- FlaskでmongoDBを使うチュートリアルをやってみた & チュートリアル和訳 (かなり雑ですが)
- PythonでWebアプリ開発入門のススメ Flask/MongoDB
- MongoDBってなんだ?
- SQL脳に優しいMongoDBクエリー入門
- MongoDB入門 (全14回) - ドットインストール
- MongoDBとMySQLでのスキーマデザインの違い
おわりに
自分用のメモということもあり、かなり雑になってしまいましたがとりあえず勉強内容はまとまったかな? 使ってみた感じ、スキーマレスっていうのは本当に手軽でいい。ユーザ管理とかはRDBの方がいいかもだけど次Webアプリ書く時はmongo使ってみたい。
次はRedisの勉強しようかな?
データベース徹底攻略 (WEB+DB PRESS plus)
- 作者: 松信嘉範,羽生章洋,ミック,奥野幹也,松下雅和,桑野章弘,青木峰郎,ひろせまさあき,小林篤,島田慶樹,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/15
- メディア: 大型本
- この商品を含むブログ (2件) を見る