irpas技术客

python + Flask 操作MongoDB数据库,以及使用中的常见问题_G东当

大大的周 6251

提示:超详细文章,由于第一次接触Flask,对这个还不是很熟悉,自己查了好多的的文章,但是写的都不是很全面,对于这块的基本操作做一个系统的总结

文章目录 需要了解的基础知识一、数据库与集合的创建二、增加三、删除四、修改五、查询六、补充搭建flask服务 七、总结以下是我在实际操作中遇到的问题


需要了解的基础知识

话不多说,直接进入正题。首先我们要了解的是,数据库与集合只有在插入数据的时候才会被正真的创建,否则不会真正的创建MongoDB数据库是非关系型的数据库,也是最像关系型数据库的非关系型数据库,可以理解成介于Mysql(表结构)与Redis(键值对结构)之间的文档数据库,集合的方式进行存储。python操作mongodb的模块为pymongo。 Flask也是一个Web框架,我对它的了解不是很多,有想了解的自行百度,也可以留下联系方式一起交流,一起学习,我其实很菜的

一、数据库与集合的创建

示例:我这里是单独封装了一个函数,在数据存储的时候首先要判断集合是否存在,如果不存在则创建集合,

import pymongo client = pymongo.MongoClient("mongodb://localhost:27017/") mydb= client['mydb'] def open(): mydb_collist = mydb.list_collection_names()# 获取所有集合列表 if "runout" not in mydb_collist: mydb["a"] if "runinfo" not in mydb_collist: mydb['a'] 二、增加

向某一集合中增加数据,以集合a为例,插入一条数据 首先介绍以下常用的方法

insert 可以插入多条,也可以插入一条insert_many 插入多条insert_one 插入一条 当使用insert插入一条数据的时候会出现一个警告 res = {"name":"tom","age":12, "class":["语文","数学","英语"],"teach":{"语文":"bill","数学":"lili","英语":"AMy"}} mydb["a"].insert_one(res) #正常插入一条数据 mydb["a"].insert_many(res_list) # 插入多条数据res_list为列表

使用案例如下:

# logdb.py import pymongo def insert_data(data): client = pymongo.MongoClient("mongodb://localhost:27017/") mydb = client['mydb'] if isinstance(data, list): mydb.a.insert_many(data) elif isinstance(data, dict): mydb.a.insert_one(data) else: return {"res":"fail","data":"参数无效"} 三、删除

向某一集合中删除数据,以集合a为例,删除一条或者数据 首先介绍以下常用的方法

delete_many 删除多条数据delete_one 删除一条数据find_one_and_delete 删除一条数据

find_one_and_delete ()根据过滤器和排序条件从集合中删除单个文档,并返回删除的文档。

delete_one()从集合中删除单个文档

# logdb.py def delete_data(test_id): client = pymongo.MongoClient("mongodb://localhost:27017/") mydb = client['mydb'] #mydb.a.delete_many({"test_id": test_id}) 删除多条数据 mydb.a.delete_one({"test_id": test_id}) #删除单条 四、修改

把某一集合中数据修改,以集合a为例,修改一条或者数据 首先介绍以下常用的方法

update_many 更新多条数据update_one 更新一条数据find_one_and_update 更新一条数据

find_one_and_update ()根据过滤器和排序条件从集合中更新单个文档,并返回更新的文档。

delete_update()从集合中更新单个文档 代码如下

# logdb.py def update_data(info): mydb = client['mydb'].a try: mydb.find_one_and_update({"run_id": info["run_id"], "id": info["id"]}, { "$set": {"data": info["data"]}}) return {"result": "ok", "data": "成功"} except: return {"result": "error", "data": "更新失败"} 五、查询 find() 查询多条数据find_one() 查询一条数据 find_one 的返回值为dict find的返回值为游标对象(obj),需要list(obj),才可以循环遍历 # logdb.py def find_data(proj_id): mydb = client['mydb'].a vs = mydb.a.find({"proj_id": proj_id}).sort([("update", 1)]) li = [] for item in list(vs): if item["version"] != '': li.append(item["version"]) li.append('') return {"result": "ok", "data": li} 六、补充 搭建flask服务

所有服务的入口均在app.py中static 静态资源路径templates 模板路径此项目中static与templates文件夹中存放的静态资源为项目的说明文档以及使用手册接口api为restfulapilogdb模块为数据库的基本操作 from flask import Flask, Response from flask import render_template, redirect, jsonify, request from logdb import log_db app = Flask(__name__, static_folder='static', template_folder='templates') app.config['JSON_AS_ASCII'] = False @app.route('/') def helper_first(): return redirect('/help') @app.route('/help') def helper(): return render_template("index.html") @app.route('/logdb/project/<proj_id>', methods=["get"]) def get_versions(proj_id): """ 功能:获取项目版本list """ res = log_db.get_versions(proj_id) return jsonify(res) @app.route('/logdb/runtree', methods=["get"]) def get_run_tree(): """ 功能:获取执行树 """ proj_id = request.args.get("proj_id") version = request.args.get("version") res = log_db.get_run_tree(dict(proj_id=proj_id, version=version)) return jsonify(res) 七、总结 以下是我在实际操作中遇到的问题 由于MongoDB数据库自身存在一个id类型为ObjectID,当查询数据的时候,需要单独序列化,或者转成str类型,我这里使用的方法为转成str def get_idstr(res): """ ObjectID类型转成string类型 """ _id = res["_id"] res["_id"] = _id.__str__() return res import json from bson import ObjectId class ObjectIdjson(json.JSONEncoder): def default(self, object_id): """ 单独序列化 """ if isinstance(object_id, ObjectId): return str(object_id) return json.JSONEncoder.default(self, object_id) restfulapi 返回前端的中文字符串显示unicode编码的问题 我这里使用的序列化方法均为jsonify,所以我只需要在我的首个服务i的py文件,也就是app.py中加入app.config['JSON_AS_ASCII'] = False,解决了中文显示unicode编码的问题服务启动总显示404的问题 一致没有发现这是什么问题,后来换了一个启动端口就解决这个问题了,原因可能是端口被占用flask 获取前端参数 以json数据的传输方式为例 GET: request.args.get(“version”) POST:request.json.get(“data”) 也可以直接获取路径参数


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Python #Flask #操作MongoDB数据库 #以及使用中的常见问题