在Python后端项目FastApi中利用MongoDB进行数据处理

打印 上一主题 下一主题

主题 1762|帖子 1762|积分 5286

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我在前面随笔《在SqlSugar的开发框架中增长对低代码EAV模型(实体-属性-值)的WebAPI实现支持》中先容了对于EAV数据存储的时候,我们把变化字段的数据记录存储在MongoDB数据库里面,这样除了支持动态化字段变化外,也更好的支持对字段不同类型的查询处理,之前随笔先容的是基于C#操作MongoDB数据库的处理,由于Python后端FastApi项目的设计初志是可以平滑更换 SqlSugar项目的Web API的,因此会涉及到在Python项目中对MongoDB的相关操作。本篇随笔先对Python环境中操作MongoDB数据库进行相关的先容。
1、Python环境中操作MongoDB数据库的准备

如果必要了解相关MongoDB数据库的相关信息和C#开发MongoDB的内容,可以参考我的随笔《MongoDB数据库内容》,里面包含我对这个主题的相关先容。
具体可以进一步参考官网里面的先容。
https://www.mongodb.com/zh-cn/docs/
https://www.mongodb.com/zh-cn/docs/drivers/csharp/current/
https://www.mongodb.com/zh-cn/docs/languages/python/
https://www.mongodb.com/zh-cn/docs/drivers/motor/
如果我们必要下载安装,可以根据不同的操作体系下载对应的社区版本安装文件即可。
https://www.mongodb.com/zh-cn/products/self-managed/community-edition
安装完成后,可以利用管理工具进行MongoDB数据库的连接和创建,如下所示可以根据不同的必要创建不同的集合。

关系型数据库和MongoDB的数据库,它们的相关概念,对比关系图如下所示。

我们安装MongoDB数据库后,它是驻留在Window的服务里面,创建服务并顺利启动成功后,然后就可以在体系的服务列表里查看到了,我们确认把它设置为自动启动的Windows服务即可。

由于我们希望利用异步来操作MongoDB数据库,推荐利用motor驱动来操作它。Motor是一个异步mongodb driver,支持异步读写mongodb。
具体利用我们可以参考官网的先容:https://www.mongodb.com/zh-cn/docs/drivers/motor/
利用前,我们必要再我们FastAPI项目中安装MongoDB和Motor的依赖模块。就是pymonogo和motor
我的requirement.txt文件中包含下面两个

 我们如果没有初始化安装,通过pip进行安装即可。
  1. pip install pymongo motor
复制代码
利用它的底子代码如下所示。
  1. import motor.motor_asyncio
  2. client = motor.motor_asyncio.AsyncIOMotorClient()
  3. 或者
  4. client = motor.motor_asyncio.AsyncIOMotorClient("mongodb://localhost:27017")
  5. 或者
  6. client = motor.motor_asyncio.AsyncIOMotorClient('mongodb://username:password@localhost:27017/dbname')
复制代码
根据MongoDB官网的说明,MongoDB的适用场景如下:
1)网站实时数据:MongoDB非常得当实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
2)数据缓存:由于性能很高,MongoDB也得当作为信息底子办法的缓存层。在体系重启之后,由MongoDB搭建的持久化缓存层可以避免下层的数据源过载。
3)大尺寸、低价值数据存储:利用传统的关系型数据库存储一些数据时大概会比较昂贵,在此之前,许多时候程序员往往会选择传统的文件进行存储。
4)高伸缩性场景:MongoDB非常得当由数十或数百台服务器组成的数据库。MongoDB的门路图中已经包含对MapReduce引擎的内置支持。
5)对象或JSON数据存储:MongoDB的BSON数据格式非常得当文档化格式的存储及查询。
MongoDB数据库支持常规的增删改查等操作,其中它的 find方法很强盛,可以组合许多条件查询的方式,如下所示:
  1. db.collection.find({ "key" : value })    查找key=value的数据
  2. db.collection.find({ "key" : { $gt: value } })    key > value
  3. db.collection.find({ "key" : { $lt: value } })    key < value
  4. db.collection.find({ "key" : { $gte: value } })    key >= value
  5. db.collection.find({ "key" : { $lte: value } })    key <= value
  6. db.collection.find({ "key" : { $gt: value1 , $lt: value2 } })    value1 < key <value2
  7. db.collection.find({ "key" : { $ne: value } })    key <> value
  8. db.collection.find({ "key" : { $mod : [ 10 , 1 ] } })    取模运算,条件相当于key % 10 == 1 即key除以10余数为1的
  9. db.collection.find({ "key" : { $nin: [ 1, 2, 3 ] } })    不属于,条件相当于key的值不属于[ 1, 2, 3 ]中任何一个
  10. db.collection.find({ "key" : { $in: [ 1, 2, 3 ] } })    属于,条件相当于key等于[ 1, 2, 3 ]中任何一个
  11. db.collection.find({ "key" : { $size: 1 } })    $size 数量、尺寸,条件相当于key的值的数量是1(key必须是数组,一个值的情况不能算是数量为1的数组)
  12. db.collection.find({ "key" : { $exists : true|false } })    $exists 字段存在,true返回存在字段key的数据,false返回不存在字度key的数据
  13. db.collection.find({ "key": /^val.*val$/i })    正则,类似like;“i”忽略大小写,“m”支持多行
  14. db.collection.find({ $or : [{a : 1}, {b : 2} ] })    $or或 (注意:MongoDB 1.5.3后版本可用),符合条件a=1的或者符合条件b=2的数据都会查询出来
  15. db.collection.find({ "key": value , $or : [{ a : 1 } , { b : 2 }] })    符合条件key=value ,同时符合其他两个条件中任意一个的数据
  16. db.collection.find({ "key.subkey" :value })    内嵌对象中的值匹配,注意:"key.subkey"必须加引号
  17. db.collection.find({ "key": { $not : /^val.*val$/i } })    这是一个与其他查询条件组合使用的操作符,不会单独使用。上述查询条件得到的结果集加上$not之后就能获得相反的集合。
复制代码
这样,我们项目启动的时候,自动加载设置文件,并在这里初始化MongoDBClient的异步对象和集合缓存对象。
有了这些,我们为了方便,还必要对MongoDB数据库的操作进行一些的封装处理,以进步我们对接口的利用遍历,毕竟我们前面先容到了MongoDB支持非常复杂的查询和处理,我们往往只必要一些特别的接口即可,因此封装接口有利于我们对接口的利用便利性。
我们在项目的utils目次中增长一个辅助类mongo_helper.py,用来封装MongoDB的相关操作的。
我们截取部分代码,如下所示。
  1. results = collection.find({'name': {'$regex': '^M.*'}})
复制代码
例如,我们在前面先容的EAV处理中,获取MongoDB数据库的指定实体类型(对应表)的全部集合处理,在Python的数据处理层代码中如下所示。
  1. # and查询
  2. db.collection.find({
  3.          $and :  [
  4.                 { "age" :  {$gt : 10 }} ,
  5.                 { "gender" :  "man" }
  6.           ]
  7. })
  8. #or查询
  9. db.collection.find({
  10.           $or : [
  11.                     {"age" :  {$gt : 10 }},
  12.                     { "gender" :  "man"}
  13.          ]
  14. })
  15. #and查询 和 or查询
  16. db.inventory.find( {
  17.     $and : [
  18.         { $or : [ { price : 0.99 }, { price : 1.99 } ] },
  19.         { $or : [ { sale : true }, { qty : { $lt : 20 } } ] }
  20.     ]
  21. } )
复制代码
首先通过缓存接口get_collection获得对应实体类型的集合,然后传递集合到辅助类 MongoAsyncHelper后构建MongoDB辅助类,就可以利用其接口进行相关的MongoDB数据库操作处理了。
最后通过类似的处理,结合数据库操作和MongoDB数据库操作,我们把EAV的接口服务迁徙到了Python中FastAPI项目中了。

最后完成的FastAPI项目的EAV相关接口如下所示。

折叠相关模块显示如下所示。

 最后切换到Winform项目上,调整接入的Web API数据源,同样获得一样的界面效果即可。
产品数据表。

订单数据表

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

卖不甜枣

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表