python + Flask 操作MongoDB数据库,以及使用中的常见问题
提示:超详细文章,由于第一次接触Flask,对这个还不是很熟悉,自己查了好多的的文章,但是写的都不是很全面,对于这块的基本操作做一个系统的总结文章目录需要了解的基础知识一、数据库与集合的创建二、增加三、删除四、修改五、删除六、补充七、总结需要了解的基础知识话不多说,直接进入正题。首先我们要了解的是,数据库与集合只有在插入数据的时候才会被正真的创建,否则不会真正的创建MongoDB数据库是非关系型的
提示:超详细文章,由于第一次接触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为restfulapi
- logdb模块为数据库的基本操作
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”)
也可以直接获取路径参数
更多推荐
所有评论(0)