MongoDB ORM для Python?

Я пытаюсь перейти с sqlalchemy (SQlite) на использование mongodb. Я хотел бы проверить схему. Я смотрю на mongokit, но хочу что-то похожее на мапперы, чтобы оно спасало от свойства объекта, а не от слова.

Я хотел бы картограф, чтобы я мог использовать существующие объекты без их изменения.

Ответ 1

Другим вариантом является MongoEngine. ORM для MongoEngine очень похож на ORM, используемый Django.

Пример (из учебника):

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()

Ответ 2

Не удовлетворившись ни 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

Ответ 3

Вы хотите 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']}, 
    ]

Ответ 4

Я знаю, что я очень опаздываю на этот вопрос, но я автор 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. Вот пример уровня ORM в Ming (из учебника):

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))