博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django操作NOSQL(MongoDB)数据库
阅读量:4053 次
发布时间:2019-05-25

本文共 2685 字,大约阅读时间需要 8 分钟。

转自:http://dmyz.org/archives/251

每一个Django工程师在接触NOSQL数据库的时候,肯定都会思考一个问题:在Django中不能像操作普通的关系型数据库(以下简称RDB)一样,操作NOSQL数据库吗?当然可以,Django工程师几乎不需要什么学习成本,就能使用NOSQL数据库——因为有mongoengine这个模块。

MongoEngine由Python语言写成,提供一个很类似Django ORM的API,本文介绍mongoengine的基本使用,主要是数据结构的定义和内联表单的使用。

Install & Begin

需要安装两个模块,pymongo和mongoengine

pip install -U mongoengine
pip install pymongo

现在我们以最快的方式利用Django对MongoDB进行操作,请在电脑旁放置一个秒表,理论上完成这些操作的时间不会超过3分钟:

新建一个应用,其中新建一个docs.py文件,代码如下:

1234567
from mongoengine import *connect('test') class User(Document):    username = StringField(required=True)    website = URLField()    tags = ListField(StringField(max_length=16))

然后编辑views.py文件:

123456789101112
from django.http import HttpResponsefrom . import docs def index(request):    user1 = docs.User(        username='Perchouli',        website='http://dmyz.org',         tags = ['Web','Django','JS']    )    user1.save()    Oid = user1.id    return HttpResponse(Oid)

最后,把视图加到URL中,访问这个视图可以看到返回的ObjectID,我们已经实现了对NOSQL数据库的写入和查找了。是不是和Django ORM几乎一样呢?

Philosophy

回头说说代码。docs.py中的语法很类似models.py,但两者的用途完全不同。mongoengine是定义一个scheme,这些定义不会写入到数据库中。

在User中使用了三种Field,MongoDB是使用JSON格式存储数据,所以写入的值也可以是对象/数组/字典,mongoengine会自动将Python数据格式转换成JS数据格式,但必须按照之前的定义的Field类型来传值。比如上例中的tags被定义为数组(ListField),数组中的每个元素是字符(StringField),mongoengine只接受同样类型的数据格式。

EmbeddedField

RDB对数据的组织是建立在“关系”之上的,比如我们要存储某个用户的Profile,它与用户ID是多对一的关系,在RDB中,通常要新建一张名为Profile的表,其中包含UserID和Profile,每一条数据对应一个Profile的记录,这种方式多少显得有些笨拙。NOSQL的出现解决了这类问题,在NOSQL数据库中使用内联的方式,直接把Profile存在User下,调用User时就可以获得Profile的数据了。

修改上例中的docs.py,增加Profile:

12345678910111213
from mongoengine import *connect('test')#先定义名为Profile的EmbeddedDocumentclass Profile(EmbeddedDocument):    gender = StringField()    location = StringField() class User(Document):    username = StringField(required=True)    website = URLField()    tags = ListField(StringField(max_length=16))    #添加到User    profile = EmbeddedDocumentField(Profile)

再修改views.py,为了显示区别这里输出一个JSON格式的字符串:

1234567891011121314
from django.http import HttpResponsefrom . import docs def index(request):    profile1 = docs.Profile(gender='male', location='Beijing')    user1 = docs.User(        username='Perchouli',        website='http://dmyz.org',         tags = ['Web','Django','JS'],        profile = profile1    )    user1.save()    user1_json = str(user1.to_mongo())    return HttpResponse(user1_json)

怎么读取profile中的gender和location?我不说你可能也想到了: user1.profile.gender。其他的操作也一样,都是用for来遍历数据,查找、删除也是类似的语法。

Afterword

mongoengine这种类似ORM的写法提供了一个很好的过渡方式,但NOSQL数据库毕竟不是构建于”关系”之上的,很多ORM的经验并不适用。其实操作NOSQL数据库,对它进行增删改查并不复杂,真正头疼的是数据的建模,具体的业务逻辑,怎样设计才能最大限度的发挥NOSQL数据库的用途等等一些列问题。mongoengine降低了Django工程师使用NOSQL数据库的门槛,相信只要有更多的人参与其中,这类经验会逐步丰富和完善的。

转载地址:http://jxxci.baihongyu.com/

你可能感兴趣的文章
一些界面标准规范
查看>>
不是人过的四天!
查看>>
Roller2.1的配置手册
查看>>
关于session的详细解释
查看>>
Just one month!
查看>>
Reading Design Patterns
查看>>
华为公司 java 面试题
查看>>
走好创业之路第一步——创业时机的选择与目标的设定
查看>>
软件项目计划如何编写
查看>>
10 Places You Must Use Ajax
查看>>
刷脸支付青蛙Pro打通微信卡包小程序
查看>>
Flutter 事件分发流程
查看>>
大数据分析需要什么技术架构?
查看>>
Java开发有必要转大数据吗?
查看>>
Scala对于大数据开发重要吗?Scala基础学习建议
查看>>
Java大数据方向:入行Java大数据值得吗
查看>>
转行大数据还是人工智能,哪个发展更好
查看>>
大数据工程师简历怎么写,更受到HR青睐?
查看>>
大数据开发就业:大数据开发有哪些岗位
查看>>
Spark计算引擎:Spark数据处理模式详解
查看>>