面向Python的MongoDB ORM?

2024-05-29 11:17:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从sqlalchemy(SQlite)迁移到使用mongodb。我想要模式转换。我在看mongokit,但是我想要一个类似于mappers的东西,这样它就可以从对象的属性中保存,而不是一个dict

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


Tags: 对象sqlite属性sqlalchemymongodb模式dictmongokit
3条回答

你想要MongoKit。它是比PyMongo更高的抽象层。不确定您是否在使用Django,但也存在django-mongokit集成。

这个blog post的例子。注意,一旦定义了结构(例如atari.make、c64.model,…),计算机实例就可以直接引用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']}, 
    ]

由于对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

另一个选项是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()

相关问题 更多 >

    热门问题