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