适用于Python的MongoDB ORM?[关闭]


85

我正在尝试从sqlalchemy(SQlite)迁移到使用mongodb。我想要架构验证。我看了看mongokit,但我想要一个类似于映射器的东西,这样它就可以从对象的属性中保存,而不是字典。

我想要一个映射器,这样我就可以使用现有对象而无需修改它们。


1
准确地说,它应该被称为“ DRM”(文档-资源映射)
zs2020 2012年

这应该可以帮助您回答查询docs.mongodb.org/ecosystem/drivers/php-libraries
Basav 2013年

有一个名为mongolia的库,可让您通过属性或字典访问与mongo对象进行交互,并具有可启用的模式验证:github.com/zagaran/mongolia
Zags

@zsong关系和文档...不应该称为对象关系和对象文档吗?
Jaime Sangcap 2015年

这可能会有所帮助:pythonhosted.org/Flask-MongoAlchemy

Answers:


69

另一个选择是MongoEngine。MongoEngine的ORM与Django使用的ORM非常相似。

示例(来自教程):

class Post(Document):
    title = StringField(max_length=120, required=True)
    author = ReferenceField(User)

class TextPost(Post):
    content = StringField()

class ImagePost(Post):
    image_path = StringField()

class LinkPost(Post):
    link_url = StringField()

16
据我所知。您无法将属性即时添加到mongoengine的文档中。哪种使mongodb变得有趣。
tutuca 2011年

9
如果需要,可以使用DictField添加任何种类的完全无模式的数据。
Neuman 2012年

还是GenericEmbeddedDocument?
tunnuz 2014年

Mongoengine存在一些严重的性能问题。如果要在生产中使用它,则只有在具有非常简单,轻量级的架构时,它才有效。
Valerie R. Coffman

3
对于那些希望获得可用于Python的MongoDB ORM的更全面概述的人,PyMongo“工具”页面列出了其中的许多内容,并定期维护:api.mongodb.com/python/current/tools.html
上升

40

对MongoKit或MongoEngine都不满意,我决定为Python编写自己的面向对象的接口。

我直接将所有查询委托给pymongo,因此那里的查询语法是相同的。通常,它只是围绕结果的一个对象包装程序,还有一些其他帮助程序,例如数据库连接池,DBRef支持和其他便利方法,可以使您的生活更轻松。

它称为Minimongo,可从github获得。骇客骇客!

例:

from minimongo import Model, MongoCollection 

class MyObject(Model): 
    model = MongoCollection(database='test', collection='my_collection')

m = MyObject()
m.x = 1
m.field = 'value'
m.other = {'list': True}
m.save()

x = MyObject({'x': 1, 'y': 2}).save()

objs = MyObject.find({'x': 1})
for o in objs: 
    print o

1
这是非常有用和简单的,我只是想要一些东西,这样我就不会创建字典了,别无其他。
vishalv2050

1
真的很好 太糟糕了,它不再维护了:(
如果__name__是None

30

您想要MongoKit。它是比PyMongo高一层的抽象层。不知道您使用的是Django,还是django-mongokit集成。

博客文章中的示例。请注意,一旦定义了结构(例如atari.make,c64.model等),然后Computer实例就可以直接引用make / model。无需字典:

import datetime 
from mongokit import Document

class Computer(Document):

    structure = { 
      'make': unicode, 
      'model': unicode, 
      'purchase_date': datetime.datetime, 
      'cpu_ghz': float, 
    }

    validators = { 
      'cpu_ghz': lambda x: x > 0, 
      'make': lambda x: x.strip(), 
    }

    default_values = { 
      'purchase_date': datetime.datetime.utcnow, 
    }

    use_dot_notation = True

    indexes = [ 
      {'fields': ['make']}, 
    ]

有没有办法在不修改现有业务逻辑对象的情况下做到这一点?在sqlalchemy中,可以使用映射器。
蒂米,2010年

更多的手术改变。保持依赖关系图干净。是有道理的,尽管我看不到直接做到这一点的方法。也许像MongoComputer(Computer,Document)类之类的奇怪东西或某种混入形式?有趣的...
Ryan Cox 2010年

它在sqlalchemy中是干净的,因此是个问题
蒂米(Timmy)

自2015年以来mongokit一直没有代码更改,自2014年以来没有发布。该死,我没有这个Python世界:(
。– JAR.JAR.beans

15

我知道这个问题我来晚了,但是我是Ming http://merciless.sourceforge.net的作者,Ming是一个受SQLAlchemy启发的MongoDB验证和ORM引擎。这是我们在SourceForge上使用的,并且在http://www.slideshare.net/rick446/rapid-and-scalable-development-with-mongodb-pymongo-and-ming上有一个合理的演示文稿,以及关于从SQLAlchemy迁移到Ming http://www.slideshare.net/__amol__/from-sqlalchemy-to-ming-with-turbogears2。这是Ming中的ORM层的一个示例(来自教程):

class WikiPage(MappedClass):

    class __mongometa__:
        session = session
        name = 'wiki_page'

    _id = FieldProperty(schema.ObjectId)
    title = FieldProperty(str)
    text = FieldProperty(str)
    comments=RelationProperty('WikiComment')

查询使用标准的MongoDB查询语法(而不是Django ORM的magic关键字参数):

WikiComment.query.find(dict(page_id=wp._id))

明对我们来说似乎是路要走。它既具有灵活性,又具有我们所需的架构式概念。当我们需要电源时,我们会选择pymongo。
jochem 2012年

1
我是mongo和python的新手。有没有教程可供我参考,以供创建django的model.py之类的模型并使用Ming创建迁移脚本。
Varad
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.