国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python利用ORM控制MongoDB(MongoEngine)的步驟全紀錄

2020-01-04 14:32:33
字體:
來源:轉載
供稿:網友

簡介:

MongoEngine 是一個Document-Object Mapper (想一下ORM, 但它是針對文檔型數據庫),Python通過它與MongoDB交互。你可能會說那PyMongo也是ORM啊,在Python中一切都是對象,但我們所說的ORM中的Object在指Python中的自定義類,而不是內置類型。MongoEngine或MongoKit將MongoDB的數據映射成自定義類實例,它們都是基于PyMongo的。 
我們可以跟關系型數據庫的Python客戶端MySQLdb,以及ORM SQLAlchemy/Django ORM比較一下,PyMongo相當于MySQLdb,MongoEngine相當于SQLAlchemy,SQLAlchemy是基于MySQLdb之上的,MongoEngine是基于PyMongo的。

pymongo來操作MongoDB數據庫,但是直接把對于數據庫的操作代碼都寫在腳本中,這會讓應用的代碼耦合性太強,而且不利于代碼的優化管理

一般應用都是使用MVC框架來設計的,為了更好地維持MVC結構,需要把數據庫操作部分作為model抽離出來,這就需要借助MongoEngine,MongoEngine提供的抽象是基于類的,創建的所有模型都是類
我們可以跟關系型數據庫的Python客戶端MySQLdb,以及ORM SQLAlchemy/Django ORM比較一下,PyMongo相當于MySQLdb,MongoEngine相當于SQLAlchemy,SQLAlchemy是基于MySQLdb之上的,MongoEngine是基于PyMongo的

安裝

pip install mongoengine

使用

1.使用時先聲明一個繼承自MongoEngine.Document的類

在類中聲明一些屬性,相當于創建一個用來保存數據的數據結構,即數據已類似數據結構的形式存入數據庫中,通常把這樣的一些類都存放在一個腳本中,作為應用的Model模塊

from mongoengine import *connect('mydb', host='localhost', port=27017)import datetimeclass Users(Document): name = StringField(required=True, max_length=200) age = IntField(required=True)users = Users.objects.all() #返回所有的文檔對象列表for u in users: print("name:",u.name,",age:",u.age)

2.保存文檔

required:設置必須;

default:如果沒有其他值給出使用指定的默認值

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

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

from mongoengine import *connect('mydb', host='localhost', port=27017)import datetimeclass Users(Document): name = StringField(required=True, max_length=200) age = IntField(required=True)user1 = Users( name='jack', age= 21)user1.save() print(user1.name)user1.name = 'jack2'user1.save()  print(user1.name)

3.查詢10=<年齡<30的,按姓名排列

from mongoengine import *connect('mydb', host='localhost', port=27017)import datetimeclass Users(Document): name = StringField(required=True, max_length=200) age = IntField(required=True)user_search = Users.objects(age__gte=10, age__lt=33).order_by('name')for u in user_search: print("name:",u.name,",age:",u.age)

查詢10=<年齡<30的,按姓名倒序

from mongoengine import *connect('mydb', host='localhost', port=27017)import datetimeclass Users(Document): name = StringField(required=True, max_length=200) age = IntField(required=True)user_search = Users.objects(age__gte=10, age__lt=33).order_by('-name')for u in user_search: print("name:",u.name,",age:",u.age)

查詢name=jack2

from mongoengine import *connect('mydb', host='localhost', port=27017)import datetimeclass Users(Document): name = StringField(required=True, max_length=200) age = IntField(required=True)tmp = Users.objects(name="jack2")for u in tmp: print("name:",u.name,",age:",u.age)

4.修改name=jack2 的age加1

from mongoengine import *connect('mydb', host='localhost', port=27017)import datetimeclass Users(Document): name = StringField(required=True, max_length=200) age = IntField(required=True)tmp = Users.objects(name="jack3").update(inc__age=1)tmp = Users.objects(name="jack3")for u in tmp: print("name:",u.name,",age:",u.age)

修改name=jack的age設為66

from mongoengine import *connect('mydb', host='localhost', port=27017)import datetimeclass Users(Document): name = StringField(required=True, max_length=200) age = IntField(required=True)tmp = Users.objects(name="jack").update(set__age=66)tmp = Users.objects(name="jack")for u in tmp: print("name:",u.name,",age:",u.age)

高級查詢 

例如有時候你需要將約束條件進行與,或的操作。你可以使用mongoengine提供的 Q 類來實現,一個 Q 類代表了一個查詢的一部分,里面的參數設置與你查詢document的時候相同。建立一個復雜查詢的時候,你需要用 & 或 | 操作符將 Q 對象連結起來,例子如下:

Post.objects(Q(name="jack") | Q(age=66))

查詢相關操作符

ne – 不等于
lt – 小于
lte – 小于等于
gt – 大于
gte – 大于等于
not – 使其檢查的反面,需要使用在其他操作符之前(e.g. Q(age__not__mod=5))
in – 值在list里面
nin – 值不在list里面
mod – value % x == y
all – list里面所有的值
size – 這個array的大小
exists – 存在這個值
#一下操作符在需要進行正則檢查的時候是比較快捷的方法:
exact – 字符串型字段完全匹配這個值
iexact – 字符串型字段完全匹配這個值(大小寫敏感)
contains – 字符串字段包含這個值
icontains –字符串字段包含這個值(大小寫敏感)
startswith – 字符串字段由這個值開頭
istartswith –字符串字段由這個值開頭(大小寫敏感)
endswith – 字符串字段由這個值結尾
iendswith –字符串字段由這個值結尾(大小寫敏感)
match – 使你可以使用一整個document與數組進行匹配查詢list

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳西县| 湾仔区| 盐源县| 镇赉县| 霍林郭勒市| 镇江市| 华池县| 子长县| 东明县| 讷河市| 新平| 胶州市| 保康县| 秦安县| 封丘县| 普洱| 普安县| 余庆县| 民县| 盘锦市| 灵丘县| 楚雄市| 马公市| 荔浦县| 沁阳市| 凤凰县| 金塔县| 隆尧县| 黄山市| 平潭县| 兴义市| 灵丘县| 汪清县| 武夷山市| 吴旗县| 黑龙江省| 麻栗坡县| 太保市| 海南省| 通渭县| 通渭县|