慕课网-Django入门到进阶-更适合Python小白的系统课程-第4章Django中的ORM和数据库-4.8mongodb的使用与表关联方法

第4章 Django 中的 ORM 和数据库

4.8 MongoDB 的使用与表关联方法

什么是 MongoDB 

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 Web 应用提供可扩展的高性能数据存储解决方案。

什么是非关系型数据库

1)被称为 NoSQL(Not Only SQL),意为不仅仅是 SQL。

2)是由 Carlo Storzzi 最早开发的个轻量、开源、不兼容 SQL 功能的关系型数据库。

3)2009 年,NoSQL 的概念,此时 NoSQL 主要是指非关系型、分布式、不提供 ACID(数据库事务处理的四个基本要素)的数据库设计模式。

4)在亚特兰大举行的 "NoSQL(east)" 讨论会上,对 NoSQL 最普遍的定义是 "非关联型的",强调 Key-Value 存储和文档数据库的优点,而不是单纯地反对 RDBMS,至少,NoSQL 开始正式出现在世人面前。

5)MongoDB 是一个介于关系型数据库和非关系型数据库之间的产品。

最常用的 NoSQL 类型

Key-Value

MongoDB 的安装之 Mac

brew install mongod

# 启动 MongoDB 服务器
mongod

# 启动客户端
mongo 

MongoDB 的安装之 Ubuntu

# 对安装库进行更新
apt-get update

# 安装
apt-get install mongo

# 启动 MongoDB 服务器
mongod

# 启动客户端
mongo

MongoDB 安装之 CentOS & Redhat

下载链接:http://www.mongodb.com/download-center/community

windows 版本:https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2012plus-4.2.3-signed.msi

举例

# 下载该文件
wget https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/4.0/x86_64/RPMS/mongodb-org-server-4.0.5-1.amzn1.x86_64.rpm

# 安装你下载的文件,ivh 查看信息和现实进度
rpm -ivh mongodb-org-server-4.0.5-1.amzn1.x86_64.rpm

# 启动 MongoDB 服务器
mongod

# 启动客户端
mongo

Pymongo

pymongo 是使用 python 连接 MongoDB 数据库的工具包

安装

pip install pymongo

初始化和建立连接、使用数据库

# 初始化和和 MongoDB 建立连接
mongo_client = pymongo.MongoClient("mongodb://localhost:27017/")

# 使用数据库
mongo_db = mongo_clent["dbs"]  

在命令行窗口进入 MongoDB 服务端和客户端

服务端

mongod

客户端

# 登录客户端
mongo

# 查询数据
dbs
show dbs
use test_dewei # 不存在
db.user.insert({'name':'dewei'})
db.user.findOne({'name':'dewei'})
db.user.insert({'_id':'123eweqwrqerqer', 'name':'小明'})
db.user.find()  

实例

1.安装 pymongo

# 可能安装不了
pip install pymongo

# 换另一种方式
pip install pymongo -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 

2.在项目 four 下目录 four,修改文件 settings.py,添加 Mongo 配置,下面只是部分代码

import os

# 新增代码
from pymongo import MongoClient

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# 新增代码
MONGOCLIENT = MongoClient(host='localhost', port=27017)

3.在项目 four 下目录 app,新建文件 mongo_models.py

from django.conf import settings

conn = settings.MONGOCLIENT['test_mongo']

class User(object):

    db = conn['user']

    @classmethod
    def insert(cls, **params):
        return cls.db.insert(params)

    @classmethod
    def get(cls, **params):
        return cls.db.find(params)

4.在命令行窗口进入 shell

python manage.py shell

5.在 shell 界面测试

from app.mongo_models import User

data = {'_id':'1234567', 'name':'dewei', 'age':30}
result = User.insert(**data)
result

data = User.get(_id=result)
list(data)

6.在项目 four 下目录 app,修改文件 mongo_models.py

from django.conf import settings

conn = settings.MONGOCLIENT['test_mongo']

class User(object):

    db = conn['user']

    @classmethod
    def insert(cls, **params):
        return cls.db.insert(params)

    @classmethod
    def gets(cls, **params):
        return list(cls.db.find(params))

    @classmethod
    def get(cls, **params):
        return cls.db.find_one(params)

7.在 shell 界面测试,先退出原来的 shell,再重新登录

from app.mongo_models import User

data = User.get(_id='1234567')
data

User.insert(_id='45678', name='kenan', age=35)

8.在项目 four 下目录 app,修改文件 mongo_models.py,添加更新 

from django.conf import settings

conn = settings.MONGOCLIENT['test_mongo']

class User(object):

    db = conn['user']

    @classmethod
    def insert(cls, **params):
        return cls.db.insert(params)

    @classmethod
    def gets(cls, **params):
        return list(cls.db.find(params))

    @classmethod
    def get(cls, **params):
        return cls.db.find_one(params)

    @classmethod
    def update(cls, _id, **params):
        cls.db.update({'_id':_id}, {'$set':params})

9.在 shell 界面测试,先退出原来的 shell,再重新登录

from app.mongo_models import User

User.update(_id='45678', name='xiaohuang')
rs = User.gets(_id='45678')
rs

# 这条数据要额外导入 ObjectId
User.insert(name='小黑', age=50)

from bson import ObjectId

rs = User.get(name='小黑')
rs

# 这样速度会受到影响
ObjectId(str(rs.get('_id')))

# 解决方法
import uuid
import time

uuid.uuid4()
'{}{}'.format(uuid.uuid4(), time.time())

10.使用表关联需要安装 mongoengine

pip install mongoengine

11.在项目 four 下目录 app,新建文件 mongo_engine.py

from mongoengine import connect, Document, StringField, IntField, ReferenceField

connect('test_mongo', host='localhost', port=27017)

class Users(Document):
    name = StringField(required=True, max_length=200)
    age = IntField(required=True)

class Paper(Document):
    title = StringField(required=True, max_length=200)
    user = ReferenceField(Users)

12.在 shell 界面测试,先退出原来的 shell,再重新登录

from app.mongo_engine import Users, Paper

user = Users.objects.create(name='dewei', age=33)
user

user.name
user.age
user.id

paper = Paper(title='test', user=user)
paper.save()
paper
paper.title
paper.user

rs = Paper.objects.filter(title='test')
rs
rs.user

  

 

  

 

  

  

  

  

  

posted on 2020-02-02 09:26  herisson_pan  阅读(10)  评论(0)    收藏  举报

导航