Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录


Posted in Python onSeptember 13, 2018

简介:

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 datetime
class 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 datetime
class 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 datetime
class 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 datetime
class 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 datetime
class 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 datetime
class 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 datetime
class 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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python验证企业工商注册码
Oct 25 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
Sep 19 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
Jan 24 Python
python3.6的venv模块使用详解
Aug 01 Python
Python变量访问权限控制详解
Jun 29 Python
对django中foreignkey的简单使用详解
Jul 28 Python
Python在OpenCV里实现极坐标变换功能
Sep 02 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
Nov 19 Python
Python for i in range ()用法详解
Sep 18 Python
Numpy(Pandas)删除全为零的列的方法
Sep 11 Python
Python使用UDP实现720p视频传输的操作
Apr 24 Python
关于python类SortedList详解
Sep 04 Python
python中字符串内置函数的用法总结
Sep 13 #Python
浅析python继承与多重继承
Sep 13 #Python
Python中分支语句与循环语句实例详解
Sep 13 #Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 #Python
Python爬虫基础之XPath语法与lxml库的用法详解
Sep 13 #Python
Python爬虫常用小技巧之设置代理IP
Sep 13 #Python
python集合比较(交集,并集,差集)方法详解
Sep 13 #Python
You might like
Laravel日志用法详解
2016/10/09 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
safari,opera嵌入iframe页面cookie读取问题解决方法
2010/06/23 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
javascript正则表达式之分组概念与用法实例
2016/06/16 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
深入浅析JavaScript中的Function类型
2016/07/09 Javascript
微信开发 消息推送实现代码
2016/10/21 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
js实现移动端编辑添加地址【模仿京东】
2017/04/28 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
详解封装基础的angular4的request请求方法
2018/06/05 Javascript
layui 设置table 行的高度方法
2018/08/17 Javascript
vue 移动端适配方案详解
2018/11/15 Javascript
layui使用label标签的方法
2019/09/14 Javascript
Weex开发之地图篇的具体使用
2019/10/16 Javascript
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
Python使用smtp和pop简单收发邮件完整实例
2018/01/09 Python
使用python验证代理ip是否可用的实现方法
2018/07/25 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
python算的上脚本语言吗
2020/06/22 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
2020/08/17 Python
python 绘制场景热力图的示例
2020/09/23 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
python字典按照value排序方法
2020/12/28 Python
中国跨镜手机配件批发在线商店:TVC-Mall
2019/08/20 全球购物
安全检查与奖惩制度
2014/01/23 职场文书
简历中的自我评价范文
2014/02/05 职场文书
采购求职信
2014/03/17 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
2015元旦主持词开场白和结束语
2014/12/14 职场文书
干部外出学习心得体会
2016/01/18 职场文书
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python