侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   314

简介:

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 C 不等于
lt C 小于
lte C 小于等于
gt C 大于
gte C 大于等于
not C 使其检查的反面,需要使用在其他操作符之前(e.g. Q(age__not__mod=5))
in C 值在list里面
nin C 值不在list里面
mod C value % x == y
all C list里面所有的值
size C 这个array的大小
exists C 存在这个值
#一下操作符在需要进行正则检查的时候是比较快捷的方法:
exact C 字符串型字段完全匹配这个值
iexact C 字符串型字段完全匹配这个值(大小写敏感)
contains C 字符串字段包含这个值
icontains C字符串字段包含这个值(大小写敏感)
startswith C 字符串字段由这个值开头
istartswith C字符串字段由这个值开头(大小写敏感)
endswith C 字符串字段由这个值结尾
iendswith C字符串字段由这个值结尾(大小写敏感)
match C 使你可以使用一整个document与数组进行匹配查询list

总结

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


  • 上一条:
    Python线程下使用锁的技巧分享
    下一条:
    python中字符串内置函数的用法总结
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客