我试图从sqlalchemy(sqlite)转换为使用mongodb.我想要架构顶点.我正在看mongokit,但我想要类似于mappers的东西,以便它可以从对象的属性中保存,而不是dict.
我想要一个映射器,以便我可以使用现有的对象而无需修改它们.
另一个选择是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()
对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
你想要MongoKit.它是比PyMongo更高的一层抽象.不确定你是否使用Django,但也有django-mongokit集成.
此博客文章的示例.请注意,一旦定义了结构,计算机的实例就可以直接引用make/model(例如atari.make,c64.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']}, ]
我知道这个问题我已经迟到了,但我是Ming http://merciless.sourceforge.net的作者,这是一个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的魔术关键字参数):
WikiComment.query.find(dict(page_id=wp._id))