提示:超详细文章,由于第一次接触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”)
    也可以直接获取路径参数
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐