慕课网-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) 收藏 举报
浙公网安备 33010602011771号