python中odm的用法 mongoengine

PyMongo是一個(gè)低級(jí)的MongoDB的Python驅(qū)動(dòng)器(我一般稱為客戶端)巩趁,它封裝了 MongoDB API两嘴,并通過JSON與MongoDB通信扔字,PyMongo將MongoDB的數(shù)據(jù)映射成Python的內(nèi)置類型。
MongoEngine 是一個(gè)Document-Object Mapper (想一下ORM, 但它是針對(duì)文檔型數(shù)據(jù)庫(kù))捌显,Python通過它與MongoDB交互吠式。你可能會(huì)說那PyMongo也是ORM啊陡厘,在Python中一切都是對(duì)象,但我們所說的ORM中的Object在指Python中的自定義類奇徒,而不是內(nèi)置類型雏亚。MongoEngine或MongoKit將MongoDB的數(shù)據(jù)映射成自定義類實(shí)例,它們都是基于PyMongo的摩钙。
我們可以跟關(guān)系型數(shù)據(jù)庫(kù)的Python客戶端MySQLdb罢低,以及ORM SQLAlchemy/Django ORM比較一下,PyMongo相當(dāng)于MySQLdb胖笛,MongoEngine相當(dāng)于SQLAlchemy网持,SQLAlchemy是基于MySQLdb之上的,MongoEngine是基于PyMongo的长踊。
MongoEngine是一個(gè)ORM

安裝

pip install mongoengine

連接

from mongoengine import * 
connect(‘mongoengine_test’,host=’localhost’,port=27017)

定義文檔中的存放數(shù)據(jù)的字段,還要繼承Document類,在這里定義好模型限制,以后save的時(shí)候做驗(yàn)證用得著

import datetime

class Post(Document):
    title = StringField(required=True, max_length=200)
    content = StringField(required=True)
    author = StringField(required=True, max_length=50)
    published = DateTimeField(default=datetime.datetime.now)

required:設(shè)置必須功舀;

default:如果沒有其他值給出使用指定的默認(rèn)值

unique:確保集合中沒有其他document有此字段的值相同

choices:確保該字段的值等于數(shù)組中的給定值之一

4.完整的插入保存過程

from mongoengine import *

connect('mongoengine_test',host='localhost',port=27017)

import datetime

class Post(Document):
title = StringField(required=True, max_length=200)
content = StringField(required=True)
author = StringField(required=True, max_length=50)
published = DateTimeField(default=datetime.datetime.now)

post_1 = Post(
title='Sample Post',
content='Some engaging',
author='scott'
)
post_1.save()
print(post_1.title)

post_1.title = '張昆'

post_1.save()
print(post_1.title)

mongoengine基本用法實(shí)例:

from mongoengine import *
from datetime import datetime

#連接數(shù)據(jù)庫(kù):test
# connect('test')    # 連接本地test數(shù)據(jù)庫(kù)
connect('test', host='127.0.0.1', port=27017, username='test', password='test')

# Defining our documents
# 定義文檔user,post,對(duì)應(yīng)集合user,post
class User(Document):
    # required為True則必須賦予初始值
    email = StringField(required=True)
    first_name = StringField(max_length=50)
    last_name = StringField(max_length=50)
    date = DateTimeField(default=datetime.now(), required=True)

# Embedded documents,it doesn’t have its own collection in the database
class Comment(EmbeddedDocument):
    content = StringField()
    name = StringField(max_length=120)

class Post(Document):
    title = StringField(max_length=120, required=True)
    # ReferenceField相當(dāng)于foreign key
    author = ReferenceField(User)
    tags = ListField(StringField(max_length=30))
    comments = ListField(EmbeddedDocumentField(Comment))
    # 允許繼承
    meta = {'allow_inheritance': True}

class TextPost(Post):
    content = StringField()

class ImagePost(Post):
    image_path = StringField()

class LinkPost(Post):
    link_url = StringField()

# Dynamic document schemas:DynamicDocument documents work in the same way as Document but any data / attributes set to them will also be saved
class Page(DynamicDocument):
    title = StringField(max_length=200, required=True)
    date_modified = DateTimeField(default=datetime.now())

添加數(shù)據(jù)

john = User(email='john@example.com', first_name='John', last_name='Tao').save()
ross = User(email='ross@example.com')
ross.first_name = 'Ross'
ross.last_name = 'Lawley'
ross.save()

comment1 = Comment(content='Good work!',name = 'LindenTao')
comment2 = Comment(content='Nice article!')
post0 = Post(title = 'post0',tags = ['post_0_tag'])
post0.comments = [comment1,comment2]
post0.save()

post1 = TextPost(title='Fun with MongoEngine', author=john)
post1.content = 'Took a look at MongoEngine today, looks pretty cool.'
post1.tags = ['mongodb', 'mongoengine']
post1.save()

post2 = LinkPost(title='MongoEngine Documentation', author=ross)
post2.link_url = 'http://docs.mongoengine.com/'
post2.tags = ['mongoengine']
post2.save()

# Create a new page and add tags
page = Page(title='Using MongoEngine')
page.tags = ['mongodb', 'mongoengine']
page.save()

創(chuàng)建了三個(gè)集合:user,post,page


這里寫圖片描述
這里寫圖片描述
這里寫圖片描述

查看數(shù)據(jù)

# 查看數(shù)據(jù)
for post in Post.objects:
    print post.title
    print '=' * len(post.title)

    if isinstance(post, TextPost):
        print post.content

    if isinstance(post, LinkPost):
        print 'Link:', post.link_url

# 通過引用字段直接獲取引用文檔對(duì)象    
for post in TextPost.objects:
    print post.content
    print post.author.email  
au = TextPost.objects.all().first().author
print au.email

# 通過標(biāo)簽查詢    
for post in Post.objects(tags='mongodb'):
    print post.title   
num_posts = Post.objects(tags='mongodb').count()
print 'Found %d posts with tag "mongodb"' % num_posts

# 多條件查詢(導(dǎo)入Q類) 
User.objects((Q(country='uk') & Q(age__gte=18)) | Q(age__gte=20))   

# 更新文檔
ross = User.objects(first_name = 'Ross')
ross.update(date = datetime.now())
User.objects(first_name='John').update(set__email='123456@qq.com')
//對(duì) lorem 添加商品圖片信息
lorempic = GoodsPic(name='l2.jpg', path='/static/images/l2.jpg')
lorem = Goods.objects(id='575d38e336dc6a55d048f35f')
lorem.update_one(push__pic=lorempic)
# 刪除文檔
ross.delete()

備注

ORM全稱“Object Relational Mapping”,即對(duì)象-關(guān)系映射身弊,就是把關(guān)系數(shù)據(jù)庫(kù)的一行映射為一個(gè)對(duì)象辟汰,也就是一個(gè)類對(duì)應(yīng)一個(gè)表,這樣阱佛,寫代碼更簡(jiǎn)單帖汞,不用直接操作SQL語句。

鏈接:

https://blog.csdn.net/u011845833/article/details/51151434
https://blog.csdn.net/u013205877/article/details/76037540

園寶科技

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凑术,一起剝皮案震驚了整個(gè)濱河市翩蘸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淮逊,老刑警劉巖催首,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異泄鹏,居然都是意外死亡郎任,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門备籽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涝滴,“玉大人,你說我怎么就攤上這事〖叽” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵诈唬,是天一觀的道長(zhǎng)韩脏。 經(jīng)常有香客問我,道長(zhǎng)铸磅,這世上最難降的妖魔是什么赡矢? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮阅仔,結(jié)果婚禮上吹散,老公的妹妹穿的比我還像新娘。我一直安慰自己八酒,他們只是感情好空民,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著羞迷,像睡著了一般界轩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衔瓮,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天浊猾,我揣著相機(jī)與錄音,去河邊找鬼热鞍。 笑死葫慎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的薇宠。 我是一名探鬼主播偷办,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼昼接!你這毒婦竟也來了爽篷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤慢睡,失蹤者是張志新(化名)和其女友劉穎逐工,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漂辐,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泪喊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了髓涯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袒啼。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚓再,到底是詐尸還是另有隱情滑肉,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布摘仅,位于F島的核電站靶庙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏娃属。R本人自食惡果不足惜六荒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望矾端。 院中可真熱鬧掏击,春花似錦、人聲如沸秩铆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豺旬。三九已至钠惩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間族阅,已是汗流浹背篓跛。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坦刀,地道東北人愧沟。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鲤遥,于是被迫代替她去往敵國(guó)和親沐寺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Mymessage.h:// 第四層 @interface Mylist : NSObject @property...
    劉半仙333閱讀 170評(píng)論 0 0
  • title: 2018-5-31 生活總結(jié)tags: blog, 我從不去想未來盖奈,因?yàn)樗鼇淼靡呀?jīng)夠快了.-Albe...
    漂無定所閱讀 360評(píng)論 0 2
  • 吃在中國(guó)混坞,食在四川。四川尤其以成都為中心的美食享譽(yù)全國(guó)钢坦,那么究孕,僅成都每天要被人們吃在肚子里的動(dòng)物有多少呢?大略統(tǒng)計(jì)...
    陳載暄閱讀 1,144評(píng)論 0 3
  • 準(zhǔn)備食材:豆腐一塊,肉沫少量爹凹,香蔥幾棵切碎厨诸,蒜泥少量,青椒紅椒少量切碎禾酱。 ① 將豆腐切小塊3cm小正方體微酬。 ② 用...
    透明的蝶閱讀 321評(píng)論 0 1
  • 高中時(shí)代颗管,我就是《動(dòng)物世界》陷遮、《神奇的地球》的忠實(shí)觀眾,總是夢(mèng)想著有天可以親自去世界各地走走看看垦江,隨著年紀(jì)的增長(zhǎng)拷呆,...
    婧婧想靜靜閱讀 246評(píng)論 0 0