Python 全栈系列58 - Flask+Datatables+Mongo的记录查询

说明

算网计算了一些结果存在本地的mongo数据库中,现在希望通过公网访问的形式提供给其他人看。

  • m1: 算网保存计算结果的机器,mongo
  • c1: 公网云主机,提供内网穿透的机器 frps
  • c2: 公网云主机,提供公网访问的机器 flask

1 内容

1.1 m1:frpc透传暴露数据库连接端口

  • 1 在~/config/frp 下配置数据库的透传端口
# 映射mongo
[ssh001003]
type = tcp
local_ip = 127.0.0.1
local_port = 27017
remote_port = 11111

然后将此文件拷贝到frpc目录下

# 将配置文件替换下载文件夹里的文件
cp ~/config/frp/frpc.ini /opt/frp/frp_0.34.0_linux_amd64/frpc.ini

再重新启动frpc服务

systemctl restart frpc

使用navicat配置后可以正常访问m1数据库了
在这里插入图片描述

1.2 c2:访问数据视图函数

这里的限制是:

  • 1 使用pymongo从数据库取数
  • 2 取数的规则是根据某个id查询文件,根据更新时间倒排,然后只取第一个

mongo还是很方便用的,最近打算全面使用mongo了。因为pickle只适合在本地,不太适合分布式的执行。之前使用RabbitMQ的体验太差,我觉得基于mongo的队列应该比较靠谱。(反正我的任务一般都是长时间计算任务,那点IO消耗不算什么)

目前我使用的pymongo版本是3.11.0,mongodb的版本4.4.2(使用docker拉取了最新版)。
在这里插入图片描述

  • 计数
假设已经获取了conn

    # 1 整个集合(表)的记录数
    some_count = collection.count_documents({})

    # 2 计算某个条件的数量
    some_count = collection.count_documents({'some_key': 'a123'})
  • 获取

全部对象(注意:不要轻易这么干,如果mongo的某个库很大,这么干内存就爆了)

all_res = collection.find()

查询获得游标

some_one = collection.find({'some_key': 'abc123'}).sort('update_time', pymongo.DESCENDING)

其中some_one就是游标

假设已经获取了conn
游标的结果可以认为是一个迭代器,有着类似tuple/list的特性

# cursor是一个迭代器,使用一次以后数据就释放了
all_res_list = list(all_res)

# 像列表一样取,迭代对象还在
print(some_one[0])

到这里已经可以获取数据了。

我看着mongo里原生的数据字段汇总有点麻烦,我觉得就把mongo当成一个快速存取的日志文件好了。例如如果要计算平均持续时间,就先取出来再计算。

假设已经获取了collection
# "_id":0表示不显示_id
all_res = collection.find({}, {"duration":1,"_id":0})

a1 = list(all_res)
# 如果要求汇总,可以借助pd.DataFrame塑形后计算
df1 = pd.DataFrame(a1)
df1['duration'].mean()

1.3 c2:返回datatables搜索查询界面

2 额外内容:基于datatables的前后端交互

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值