NoSQL于Python应用被动用MongoDB

Python是支付社区中用来许多不同档次应用的兵不血刃编程语言。很多丁且领悟它们是好处理几乎任何任务的利落语言。因而,在Python应用中需要一个哪的与语言本身一样灵活的数据库也?这就是是NoSQL,比如MongoDB。

英文原文:https://realpython.com/blog/python/introduction-to-mongodb-and-python

  

1、SQL vs NoSQL

  如果你免是杀熟谙NoSQL这么些概念,MongoDB就是一个NoSQL数据库。近几年来它越是受全方位行业之迎接。NoSQL数据库提供了一个和涉及项目数据库异常差之找情势同贮数据效能。

  以NoSQL出现的几十年来,SQL数据库是开发者寻求构建大型、可增添系统的唯一采用某个。不过,越来越多之求要求存储复杂数据结构的力量。这有助于了NoSQL数据库的诞生,它同意开发者存储异构和任社团的多少。

  当届数据库方案选时,大多数人数犹问自己最后一个题目,“SQL或NoSQL的?”。无论是SQL和NoSQL都暴发自己之独到之处和短,你当采用适合你的以需求面临最为好之某个。这里是两者之间的片段区别:

SQL

  • 范是关系型的;

  • 数据让存放在于表中;

  • 适用于诸条记下仍然一样连串并有着相同属性之景色;

  • 积存规范需要预定义结构;

  • 补偿加新的习性意味着你无法不转全体架构;

  • ACID事务帮助;

NoSQL

  • 型是非关系型的;

  • 可储存Json、键值对顶(决定给NoSQL数据库类型);

  • 并无是各条记下还设出同等的布局;

  • 增长含新特性之数平时,不碰面影响外;

  • 支撑ACID事务,依照使用的NoSQL的数据库而有所不同;

  • 一致性可以转;

  • 横向扩张;

  于个别栽档次的数据库里还有很多外的区分,但上边提到的是片双重关键的分别。按照你的具体情状,使用SQL数据库可能是首选,而以其他境况下,NoSQL的凡又明了的抉择。当采用一个数据库时,您应该谨慎考虑每个数据库的优势以及劣势。

  NoSQL的一个益处是,有许多异类另外数据库可供应选拔,并且每个都出友好之用例:

  还有好多,但那多少个是部分再度广泛的路。近日,SQL和NoSQL数据库甚至就初叶集合。例如,PostgreSQL现在补助存储和询问JSON数据,很像MongoDB。有了那个,你可以据此Postgres实现MongoDB一样的机能,但若依然没MongoDB的其余优势(如横向扩容和概括的界面,等等)。

2、MongoDB

  现在,让咱将视线转换来本文的要,并表明的MongoDB的实际的一些气象。

  MongoDB是一个面向文档的,开源数据库程序,它平台无关。MongoDB像另组成部分NoSQL数据库(但不是所有!)使用JSON结构的文档存储数据。那是驱动数据万分灵活,不需的Schema。

  一些于紧要的性状是:

  • 支撑多正经查询类型,比如matching()、comparison (,
    )或者正则说明式;

  • 得储存几乎任何项目的数据,无论是结构化,部分结构化,甚至是多态;

  • 要是扩充和拍卖又多询问,只待加加更多的机械;

  • 她是莫大灵活和高效,让你会快开应用程序;

  • 当基于文档的数据库意味着你可当么文档中存储有关而的范的装有音讯;

  • 乃可天天变动数据库的Schema;

  • 无数事关项目数据库的遵从也足以于MongoDB使用(如索引)。

  以运作方面,MongoDB中发出卓殊多的效应在外数据库中凡绝非底:

  • 无你得单独服务器依然完全的单身服务器集群,MongoDB都可因需要展开扩充;

  • MongoDB还经过当挨家挨户分片上电动移动多少来提供负载均衡补助;

  • 它们有着活动故障转移协理,假若主服务器Down掉,新的主服务器将自动启动并运行;

  • MongoDB的保管服务(MMS)可以用于监控和备份MongoDB的根底设备服务;

  • 未像关系数据库,由于内存映射文件,你以省卓殊多之RAM。

  即便起始MongoDB似乎是解决大家多题材之数据库,但她不是不曾缺陷的。MongoDB的一个宽广缺点是缺少针对ACID事务之支撑,MongoDB在一定情景下协理ACID事务,但非是于享有情状。在单文档级别,帮忙ACID事务(这是大多数政工有的地方)。可是,由于MongoDB的分布式性质,不匡助处理多单文档的作业。

  MongoDB还不够针对自然join查询帮忙。在MongoDB看来:文档意在宏观,这表示,一般的话,它们不需要参考其他文档。在具体世界被,这并无连续实惠的,因为我们运用的数码是关系性的。由此,许两个人数认为MongoDB应该吃当一个SQL数据库的续数据库,不过当你用MongoDB是,你会发觉那是错的。

3、PyMongo

  现在我们已描述了MongoDB的是呀,让我们来探视怎么着在Python中其实使用她。由MongoDB开发者公布的官驱动程序PyMongo,这里通过有些事例介绍,但您呢应当查看全部的文档,因为大家无能为力面面俱到。

  当然首先件事便是装,最简单易行的计即使是pip

pip install pymongo==3.4.0

流淌:有关还宏观的指南,请查看文档的安装/升级页面,并按照内部的步调举行设置

  完成安装后,启动之Python控制台并运行以下命令:

>>> import pymongo

  就算没指出任何非凡就印证安装成功了

建连接

  使用MongoClient对象建立连接:

from pymongo import MongoClient
client = MongoClient()

  使用方面的代码有,将建连接至默认主机(localhost)和端口(27017)。您还可指定主机和/或行使端口:

client = MongoClient('localhost', 27017)

  或者拔取MongoURl格式:

client = MongoClient('mongodb://localhost:27017')

顾数据库

  一旦而有一个接连的MongoClient实例,你可以Mongo服务器中做客任何数据库。尽管假定顾一个数据库,你得当作属性一样看:

db = client.pymongo_test

  或者您啊得接纳字典情势的访问:

db = client['pymongo_test']

  假使你的指定数据库都开立,实际上并无首要。通过点名此数据库名称并将数据保存到内,您将自行创制数据库。

安插文档

  以数据库中蕴藏数据,就不啻调用只是鲜举行代码一样好。第一推行指定你用祭什么人集合。在MongoDB中术语中,一个聚是以数据库中蕴藏在联名的平组文档(十分给SQL的注明)。集合和文档类似于SQL表和行。第二履是采取集合插入数据insert_one()的方法:

posts = db.posts
post_data = {
    'title': 'Python and MongoDB',
    'content': 'PyMongo is fun, you guys',
    'author': 'Scott'
}
result = posts.insert_one(post_data)
print('One post: {0}'.format(result.inserted_id))

  大家仍旧足以应用insert_one()同时插入很多文档,假设你发出无数之文档添加到数据库中,可以行使情势insert_many()。此办法接受一个list参数:

post_1 = {
    'title': 'Python and MongoDB',
    'content': 'PyMongo is fun, you guys',
    'author': 'Scott'
}
post_2 = {
    'title': 'Virtual Environments',
    'content': 'Use virtual environments, you guys',
    'author': 'Scott'
}
post_3 = {
    'title': 'Learning Python',
    'content': 'Learn Python, it is easy',
    'author': 'Bill'
}
new_result = posts.insert_many([post_1, post_2, post_3])
print('Multiple posts: {0}'.format(new_result.inserted_ids))

  你该看到类似输出:

One post: 584d947dea542a13e9ec7ae6
Multiple posts: [
    ObjectId('584d947dea542a13e9ec7ae7'),
    ObjectId('584d947dea542a13e9ec7ae8'),
    ObjectId('584d947dea542a13e9ec7ae9')
]

只顾:
不要担心,你和方面展现不雷同。它们是于插入数据时,由Unix的世代,机器标识符和此外唯一数据整合的动态标识。

搜寻文档

  检索文档可以动用find_one()方法,比如要找到author为比尔的记录:

bills_post = posts.find_one({'author': 'Bill'})
print(bills_post)

运行结果:
{
    'author': 'Bill',
    'title': 'Learning Python',
    'content': 'Learn Python, it is easy',
    '_id': ObjectId('584c4afdea542a766d254241')
}

  您或许曾经注意到,这篇稿子的ObjectId是安装的_id,这是随后好采取唯一标识。假若需要查询多少长度长的记下可以运用find()方法:

scotts_posts = posts.find({'author': 'Scott'})
print(scotts_posts)

结果:
<pymongo.cursor.Cursor object at 0x109852f98>

  他的关键分在文档数据不是当数组直接回给我们。相反,我们沾一个游标对象的实例。这Cursor是一个饱含十分多之帮扶方法,以助你处理数量的迭代对象。要博取每个文档,只待遍历结果:

for post in scotts_posts:
    print(post)

4、MongoEngine

  即使PyMongo是非凡容易使用,总体达标是一个壮烈之车轱辘,但是不少列应用它还或最没有品位。简单来讲,你要编制很多好的代码来不断地保留,检索和去对象。PyMongo之上提供了一个还强的肤浅一个仓库是MongoEngine。MongoEngine是一个对象文档映射器(ODM),它大体分外给一个冲SQL的靶子关联映射器(ORM)。MongoEngine提供的悬空是冲类的,所以您创设的富有模型都是近似。尽管发出一定多之Python的仓库可以扶持您使用MongoDB,MongoEngine是一个重好之,因为她起一个优良的结的效应,灵活性与社区支撑。

  使用pip安装:

pip install mongoengine==0.10.7

  连接:

from mongoengine import *
connect('mongoengine_test', host='localhost', port=27017)

  
  和pymongo不同。MongoEngine需要制订数据库名称。

概念文档

  建立文档此前,需要定义文档中如若存放数据的字段。与成千上万其他ORM类似,我们以通过持续Document类,并提供我们想念使之数据类型来就这点:

import datetime

class Post(Document):
    title = StringField(required=True, max_length=200)
    content = StringField(required=True)
    author = StringField(required=True, max_length=50)
    published = DateTimeField(default=datetime.datetime.now)

  在此简单的模子中,大家曾经告知MongoEngine,大家的Post实例有title、content、author、published。现在Document对象可以采取该消息来声明我们提供它的多少。

  因而,如若我们打算保存Post的丁没有title那么她会弃来一个Exception,让咱领会。我们还可更进一步用是并补充加更多的克:

  • required:设置必;

  • default:假诺没有外价值为出用指定的默认值

  • unique:确保集合中没有另外document有其一字段的值相同

  • choices:确保该字段的值等于数组中的受定值之一

保存文档

  将文档保存到数据库中,我们将使用save()的计。要是文档中之数据库都在,则拥有的转将当原子水平及对现有的文档举行。假若它不设有,但是,那么她会叫创设。

  这里是成立及保存一个文档的事例:

post_1 = Post(
    title='Sample Post',
    content='Some engaging content',
    author='Scott'
)
post_1.save()       # This will perform an insert
print(post_1.title)
post_1.title = 'A Better Post Title'
post_1.save()       # This will perform an atomic edit on "title"
print(post_1.title)

  调用save()的时候用小心几碰:

  • PyMongo将于你调用.save()时举行验证,这意味着它们用因你于近似吃宣称的情势检查即便保留之多少,倘诺背离情势(或约束),则弃来大而不保留数据;

  • 鉴于Mongo不协理真正的作业,由此未曾章程像在SQL数据库中那么“回滚”.save()调用。

  当您保存的多寡没有title时:

post_2 = Post(content='Content goes here', author='Michael')
post_2.save()

raise ValidationError(message, errors=errors)
mongoengine.errors.ValidationError:
ValidationError (Post:None) (Field is required: ['title'])

朝目的的性状

  使用MongoEngine是面向对象的,你也可增长方法及你的子类文档。例如下面的以身作则,其中函数用于修改默认查询集(重回集合的富有目的)。通过以它们,我们可以对类应用默认过滤器,并就取得所待的靶子

class Post(Document):
    title = StringField()
    published = BooleanField()

    @queryset_manager
    def live_posts(clazz, queryset):
        return queryset.filter(published=True)

事关其他文档

  您还足以使Reference菲尔德(Field)对象来创建于一个文档到另外一个文档的援。MongoEngine在顾时自动惰性处理引用。

class Author(Document):
    name = StringField()

class Post(Document):
    author = ReferenceField(Author)

Post.objects.first().author.name

  在方的代码中,使用文档”外键”,大家可好易地找到第一首稿子的撰稿人。其实还有比这里介绍的更多的配段类(和参数),所以必然要查阅文档字段重多消息。
  
从今有着那一个示例中,您应该会晤到,MongoEngine分外适合管理几乎任何项目的应用程序的数据库对象。这个功用令创设一个便捷而扩充程序变得相当容易。假设您刚刚于寻觅再多关于MongoEngine的救助,请务必查阅他们的用户指南

网站地图xml地图