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中针对函数处理的特殊方法
Mar 06 Python
Python对象体系深入分析
Oct 28 Python
Python信息抽取之乱码解决办法
Jun 29 Python
Python 实现数据库更新脚本的生成方法
Jul 09 Python
Python3 翻转二叉树的实现
Sep 30 Python
python如果快速判断数字奇数偶数
Nov 13 Python
python @propert装饰器使用方法原理解析
Dec 25 Python
Python中itertools的用法详解
Feb 07 Python
Transpose 数组行列转置的限制方式
Feb 11 Python
Python 如何测试文件是否存在
Jul 31 Python
Python 3.9的到来到底是意味着什么
Oct 14 Python
只用40行Python代码就能写出pdf转word小工具
May 31 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
php 三维饼图的实现代码
2008/09/28 PHP
PHP实现下载断点续传的方法
2014/11/12 PHP
Laravel数据库读写分离配置的方法
2019/10/13 PHP
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
js电话号码验证方法
2015/09/28 Javascript
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
jquery解析XML及获取XML节点名称的实现代码
2016/05/18 Javascript
JavaScript中的ParseInt(&quot;08&quot;)和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
JavaScript判断是否是微信浏览器
2016/06/13 Javascript
bootstrap select插件封装成Vue2.0组件
2017/04/17 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
使用OPENLAYERS3实现点选的方法
2020/09/24 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
记一次用vue做的活动页的方法步骤
2019/04/11 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
2019/04/24 Javascript
JavaScript中的this妙用实例分析
2020/05/09 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
理解python正则表达式
2016/01/15 Python
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
Flask web开发处理POST请求实现(登录案例)
2018/07/26 Python
Python异步编程之协程任务的调度操作实例分析
2020/02/01 Python
Python 安装 virturalenv 虚拟环境的教程详解
2020/02/21 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
四方通行旅游网:台湾订房、出国旅游
2017/09/20 全球购物
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
报关员个人职业生涯规划书
2014/03/12 职场文书
学习之星事迹材料
2014/05/17 职场文书
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
2014年信贷员工作总结
2014/11/18 职场文书
清洁工个人工作总结
2015/03/05 职场文书
谁动了我的奶酪读书笔记
2015/06/30 职场文书
Apache Calcite 实现方言转换的代码
2021/04/24 Servers