MongoDB ORM для Python? [закрыто]

85

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

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

Тимми
источник
1
Точнее, он должен называться «DRM» (Document-Resource-Mapping)
zs2020
Это должно помочь вам ответить на ваш запрос. Docs.mongodb.org/ecosystem/drivers/php-libraries
Басав,
Есть библиотека под названием mongolia, которая позволяет вам взаимодействовать с объектами mongo с помощью атрибутов или доступа к словарю и имеет возможность проверки схемы, которую вы можете включить: github.com/zagaran/mongolia
Zags
@zsong Relational and Document ... Не следует называть объектно-реляционным и объектным документом?
Хайме Сангкап,
это может быть полезно: pythonhosted.org/Flask-MongoAlchemy
Сяо

Ответы:

69

Другой вариант - 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()
Давид Нараян
источник
16
НАСКОЛЬКО МНЕ ИЗВЕСТНО. Вы не можете добавлять свойства на лету в документ mongoengine. Что отвлекает от mongodb.
tutuca
9
При необходимости вы можете использовать DictField для добавления любых данных, не содержащих схемы.
neuman
Или GenericEmbeddedDocument?
tunnuz
У Mongoengine есть серьезные проблемы с производительностью. Если вы хотите использовать его в производственной среде, он будет работать, только если у вас очень простая и легкая схема.
Валери Р. Коффман
3
Для тех, кто ищет более полный обзор ORM MongoDB, доступных для Python, на странице PyMongo «Инструменты» перечислено довольно много из них, и они регулярно обновляются
Ascendant,
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
Slacy
источник
1
Это супер полезно и просто, я просто хотел что-то, чтобы не зацикливаться на создании словарей, ничего больше.
vishalv2050
1
Это действительно здорово. Жаль, что его больше не обслуживают :(
if __name__ is None
30

Вам нужен MongoKit . Это на один уровень абстракции выше, чем PyMongo . Не уверен, что вы используете Django, но есть также интеграция с django-mongokit .

Пример из этого сообщения в блоге . Обратите внимание, что экземпляры Computer могут напрямую ссылаться на 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']}, 
    ]
Райан Кокс
источник
есть ли способ сделать это без изменения существующих объектов бизнес-логики? в sqlalchemy вы можете использовать mappers.
Тимми
больше хирургических изменений. сохраняет ваш граф зависимостей чистым. имеет смысл, хотя я не вижу способа сделать это напрямую. Может быть, что-то странное вроде класса MongoComputer (Computer, Document) или с какой-то смесью? Интересно ...
Райан Кокс
его чистый в sqlalchemy, поэтому вопрос, thans
Тимми
Никаких изменений кода в mongokit с 2015 года и ни одного выпуска с 2014 года. Черт, я не понимаю этот мир питонов :(.
JAR.JAR.beans
15

Я знаю, что действительно опаздываю с этим вопросом, но я автор 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))
Рик Коупленд
источник
Мин кажется нам правильным путем. Он обладает как гибкостью, так и схематичными концепциями, которые нам нужны. Когда нам нужна энергия, мы спускаемся в пимонго.
jochem
1
Я новичок в монго и питоне. Есть ли учебник, к которому я могу обратиться для создания таких моделей, как django model.py, и создания сценариев миграции с использованием Ming.
Варад