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 @property的用法及含义全面解析
Feb 01 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
Sep 19 Python
对Python闭包与延迟绑定的方法详解
Jan 07 Python
树莓派使用USB摄像头和motion实现监控
Jun 22 Python
python脚本当作Linux中的服务启动实现方法
Jun 28 Python
利用python计算windows全盘文件md5值的脚本
Jul 27 Python
python生成requirements.txt的两种方法
Sep 18 Python
Python使用matplotlib绘制Logistic曲线操作示例
Nov 28 Python
python爬虫模拟浏览器访问-User-Agent过程解析
Dec 28 Python
python os模块常用的29种方法使用详解
Jun 02 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
Jun 14 Python
python中复数的共轭复数知识点总结
Dec 06 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
我的论坛源代码(一)
2006/10/09 PHP
如何在PHP中进行身份认证
2006/10/09 PHP
PHP的范围解析操作符(::)的含义分析说明
2011/07/03 PHP
php中利用explode函数分割字符串到数组
2014/02/08 PHP
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
2015/06/24 PHP
ThinkPHP5框架缓存查询操作分析
2018/05/30 PHP
php+ajax实现商品对比功能示例
2019/04/13 PHP
表单提交验证类
2006/07/14 Javascript
Javascript的一种模块模式
2010/09/08 Javascript
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
2013/01/04 Javascript
javascript改变position值实现菜单滚动至顶部后固定
2013/01/18 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
jquery单击事件和双击事件冲突解决方案
2016/03/02 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
使用Promise链式调用解决多个异步回调的问题
2017/01/15 Javascript
小程序实现tab标签页
2020/11/16 Javascript
[06:48]DOTA2-DPC中国联赛2月26日Recap集锦
2021/03/11 DOTA
python ip正则式
2009/05/07 Python
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
Windows 64位下python3安装nltk模块
2018/09/19 Python
python+ffmpeg批量去视频开头的方法
2019/01/09 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
Python拆分大型CSV文件代码实例
2019/10/07 Python
python文件读取失败怎么处理
2020/06/23 Python
基于html5绘制圆形多角图案
2016/04/21 HTML / CSS
英国第二大营养品供应商:Vitabiotics
2016/10/01 全球购物
黄继光的英雄事迹材料
2014/02/13 职场文书
环保倡议书怎么写
2014/05/16 职场文书
初中数学课堂教学反思
2016/02/17 职场文书
血轮眼轮回眼特效 html+css
2021/03/31 HTML / CSS
Nginx tp3.2.3 404问题解决方案
2021/03/31 Servers
golang 如何用反射reflect操作结构体
2021/04/28 Golang