Mogoengine + Atlas

No SQLデータベースのmongodbには無料クラウド版のatlasがある.接続にmongoengineを使って試してみた.

クラウドDB設定(日本リージョンで無料枠あるgcp)してから,以下で接続できる.Chromeだとエラーするので,FireFoxでやる.最近,Chromeのセキュリティのせいか動かないものが多いような気がする(Youtubeのアナリティクスとか).

AtlasのConnectで接続文字列が得られるがPyMongoからの接続法しかのっていない.ググればなんとかなる.

from mongoengine import connect

db_uri = "mongodb+srv://username:password:@cluster0.9gmd5.gcp.mongodb.net/?retryWrites=true&w=majority")
db = connect("test1", host=db_uri)

ユーザー名やパスワードに特殊文字が含まれていると,「Username and password must be escaped according to RFC 3986, use urllib.parse.quote_plus().」と文句を言うので,以下のように変換しておく方が無難だ.

import urllib
username = urllib.parse.quote_plus(username)

クラスを書けば,データベースにマッピングしてくれるようだ.時間ができたら,試しに色々やってみよう.本家の例題を貼っておく.

from mongoengine import *
connect('mydb')

#ブログポストクラスをドキュメントから派生させて作成
class BlogPost(Document):
   title = StringField(required=True, max_length=200)
   posted = DateTimeField(default=datetime.datetime.utcnow)
   tags = ListField(StringField(max_length=50))
   meta = {'allow_inheritance': True}
   
#テキストポストをブログポストからは生させて,コンテンツフィールドを追加
class TextPost(BlogPost):
   content = StringField(required=True)
   
#リンクポストはurlフィールドを追加
class LinkPost(BlogPost):
   url = StringField(required=True)
   
# Create a text-based post
>>> post1 = TextPost(title='Using MongoEngine', content='See the tutorial')
>>> post1.tags = ['mongodb', 'mongoengine']
>>> post1.save()

# Create a link-based post
>>> post2 = LinkPost(title='MongoEngine Docs', url='hmarr.com/mongoengine')
>>> post2.tags = ['mongoengine', 'documentation']
>>> post2.save()

# Iterate over all posts using the BlogPost superclass
>>> for post in BlogPost.objects:
...     print('===', post.title, '===')
...     if isinstance(post, TextPost):
...         print(post.content)
...     elif isinstance(post, LinkPost):
...         print('Link:', post.url)
...

# Count all blog posts and its subtypes
>>> BlogPost.objects.count()
2

>>> TextPost.objects.count()
1

>>> LinkPost.objects.count()
1

# Count tagged posts
>>> BlogPost.objects(tags='mongoengine').count()
2

>>> BlogPost.objects(tags='mongodb').count()
1

この記事が気に入ったらサポートをしてみませんか?