zoukankan      html  css  js  c++  java
  • Flask学习Ⅲ (+MongoDB)

    MongoDB

    1.准备阶段

    • 下载MongoDB https://www.mongodb.com/

    • 默认监听端口:27017 (mysql:3306;redis:6379)

    • MonogDB 启动 指定mongodb数据存储目录

      • mongod --dbpath="D:/mongodb/data/db"

    2.介绍MongoDB:

    NoSQL 文件型数据库 非关系型
    特点 : 存储自由

    举个栗子:

    MySQL:
    id		name		age			sp			wq
    1		孙悟空		999			null			定海神针
    2		沙悟净		998			唐僧同款项链		null
    
    MongoDB:
    {
    	id:1,
    	name:孙悟空,
    	age:999,
    	wq:定海神针,
    },
    {
    	id:1,
    	name:沙悟净,
    	age:998,
    	sp:唐僧同款项链
    }
    可见MongoDB存储的数据之间的格式可以不同!
    而且还可以存入列表和字典,只要满足JSON数据即可!
    

    3.MongoDB 基本指令

    show databases	            查看本地磁盘中数据库
    use databaseName	    切换数据库
    db		            查看当前使用的数据库
    show tables		    查看当前数据库的表(磁盘中)
    

    4.MongoDB 数据 新建

    use 不存在的数据库名 == 在内存中创建该数据库
    db.不存在的表名 == 即在该数据库中创建该表(内存中)
    
    总结:使用了不存在的对象即创建该对象!
    

    5.增删改查

    db.tableName.insert({})
    db.user.insert({name:"沙悟净",age:666.666})
    db.user.insert([{},{}])
    
    #官方推荐 3.2+
    db.user.insertOne({})			增加一条
    db.user.insertMany([{},{}])		批量增加
    
    db.tableName.find({查询条件})	查询符合条件的所有数据
    db.user.find({name:"孙悟空"})	条件查询
    db.user.find({name:"孙悟空",age:99999})	并列条件查询
    
    db.user.findOne({})	  条件为空查询表中所有数据
    
    $数据比较符(仅用于数字比较)
    $lt	小于
    $lte	小于等于
    $gt	大于
    $gte	大于等于
    $eq	等号(基本没用)
    $ne	不等于
    举例: db.user.find({age:{$gt:666}})	查询年龄大于666的数据
    
    db.tableName.update()	修改符合条件的第一条数据
    
    所有MongoDB的修改全部基于 修改器
    
    $修改器
    
    $set
    db.user.update({name:"沙悟净"},{$set:{age:888}})
    强制的将某字段值修改!
    db.user.update({name:"孙悟空"},{$set:{ageage:888}})
    如果该字段不存在,即创建该字段并赋值!
    
    $unset
    db.user.update({name:"孙悟空"},{$unset:{ageage:1}})
    删除字段(别漏了1)
    
    $inc
    db.user.update({name:"孙悟空"},{$inc:{age:1}})
    引用增加:先引用原有数据,在原有数据基础上增加(没有减,但可以加负数)
    
    针对 Array(List)操作
    $push
    db.user.update({name:"孙悟空"},{$push:{hobby:"牛魔王"}})
    相当于append() 在Array最末端增加
    
    $pushAll
    db.user.update({name:"孙悟空"},{$pushAll:{hobby:[...]}})
    相当于extend() 在Array最末端增加多条数据
    
    $pull
    db.user.update({name:"孙悟空"},{$pull:{hobby:"牛魔王"}})
    相当于remove() 删除符合条件的数据
    
    $pullAll
    db.user.update({name:"孙悟空"},{$pullAll:{hobby:[...]}})
    遍历删除 所有 符合条件的多条数据
    
    $pop
    接近于pop(),但只能删除Array中的第一条或最后一条(默认最后一个)
    db.user.update({name:"孙悟空"},{$pop:{hobby:-1}})	删除第一个
    db.user.update({name:"孙悟空"},{$pop:{hobby:1}})	删除最后一个
    
    # $关键字:
    db.user.updateOne({name:"x",hobby:"篮球"},{$set:{"hobby$":"唱歌"}})
    db.user.updateOne({name:"x","course.name":"python"},{$set:{"course$":"java"}})
    $是用来存储当前Array条件元素的下标索引
    当前Array -- ["篮球","摄影","编程"]
    条件元素 -- {hobby:"篮球"}
    当前Array的第2个元素符合条件,它的下标索引为1
    当前$的值即为1
    
    注意:如果使用".索引"的方式来操作Array,记得加引号,"字段.索引"!
    
    # 官方推荐
    db.user.updateOne({},{})    修改符合条件的第一条数据
    db.user.updateMany({},{})	修改符合条件的所有数据
    
    db.tableName.remove({查询条件})	删除符合条件的所有数据
    db.user.remove({})	条件为空则删除所有数据!危险!
    
    #官方推荐
    db.user.deleteOne({})	删除符合条件的第一条数据
    db.user.deleteMany({})  删除符合条件的所有数据,条件为空则删除所有数据!危险!
    

    6.MongoDB的数据类型

    ObjectID :Documents 自生成的 _id
    String: 字符串,必须是utf-8
    Boolean:布尔值,true 或者false
    Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)
    Double:浮点数 (没有float类型,所有小数都是Double)
    Arrays:数组或者列表,多个值存储到一个键(list,Python中的List哦)
    Object:相当于Python中的字典
    Null:空数据类型 , 一个特殊的概念,None Null
    Timestamp:时间戳
    Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)
    

    7.选取 跳过 排序

    排序
    db.user.find({}).sort({age:-1})	倒序
    db.user.find({}).sort({age:1})	正序
    	
    跳过
    db.user.find({}).skip(n)	跳过n条
    
    选取
    db.user.find({}).limit(n)	选取n条,数据条目<n则全部选取
    
    可以一起用,连点(当三个关键字同时出现,无论顺序如何,都按照"排序--跳过--选取"顺序执行)
    
    实现分页(假设每页有两条数据):
    limit = 2
    page = n
    skip = (page-1)*limit
    
    page	limit	skip	sort
    1		2		0		1
    2		2		2		1
    3		2		4		1
    4		2		6		1
    
    db.user.find({}).sort({age:-1}).skip(0).limit(2)
    db.user.find({}).sort({age:-1}).skip(2).limit(2)
    ......
    

    Flask + MongoDB

    1.首先安装 pymongo 模块

    #建立客户端的代码如下
    from pymongo import MongoClient
    
    MC = MongoClient("127.0.0.1", 27017)    # 创建链接(即客户端)
    mdb = MC["test"]  	#创建test库(记住,mongodb中使用不存在的对象即在内存中新建)
    

    2.简单的登录注册

    from flask import Flask, render_template, request, jsonify
    from db import mdb
    app = Flask(__name__)
    
    @app.route("/reg", methods=["post", "get"])
    def reg():
        if request.method == "GET":
            return render_template('reg.html')
        else:
            user_info = request.form.to_dict()
            ret = mdb.user.insert_one(user_info)
            if ret.inserted_id:		# 检查是否插入数据成功,成功会返回ObjectId
                return "注册成功!"
            else:
                return "注册失败..."
    
    @app.route("/login", methods=["post", "get"])
    def login():
        if request.method == 'GET':
            return render_template("login.html")
        else:
            user_info = request.form.to_dict()
            ret = mdb.user.find_one(user_info)	# 直接将用户输入的信息列表整个放入查询
            if ret:
                return "登陆成功!"
            else:
                return "登陆失败T_T"
    
    if __name__ == '__main__':
        app.run("0.0.0.0", 5000)
    

    3.补充一些小点

    # 用$关键字查询,$关键字要带上引号(因为python里面没有$关键字这个说法)
    db.user.find_one({"name": "xxx", "age": {"$gt": 80}})
    
    # 查找的时候,find和find_one的区别
    find返回的是一个对象,要遍历才能获取到字典形式
    find_one直接返回字典形式,无需遍历
    
    # 无论是什么操作,用到ObjectId的时候一定要先导入!
    from bson.objectid import ObjectId
    db.user.delete_one({"_id": ObjectId('5f69ab88768e4dee9da5d153')})
    
    # ObjectId的坑:
    数据进行网络传输前要JSON序列化,而ObjectId不能直接JSON序列化,但其可以先转换为字符串
    res = db.user.find_one({"name": "xxx"})
    res["_id"] = str(res.get("_id"))
    res_json = json.dumps(res)
    
    # 一个很好用的mongdb工具
    https://nosqlbooster.com/downloads
    
  • 相关阅读:
    异常处理
    PAT——1048. 数字加密
    PAT——1047. 编程团体赛
    PAT——1046. 划拳
    PAT——1045. 快速排序(25)
    PAT——1044. 火星数字
    PAT——1043. 输出PATest
    PAT——1042. 字符统计
    PAT——1041. 考试座位号
    PAT——1040. 有几个PAT
  • 原文地址:https://www.cnblogs.com/straightup/p/13714745.html
Copyright © 2011-2022 走看看