MongoDB ORM для Python? [зачинено]


85

Я намагаюся перейти від sqlalchemy (SQlite) до використання mongodb. Я хотів би вертифікації схеми. Я розглядаю mongokit, але я хочу щось схоже на карти, щоб це врятувало від власності об'єкта, а не дикту.

я хотів би картограф, щоб я міг використовувати існуючі об'єкти, не змінюючи їх.


1
Точніше, це повинно називатися "DRM" (Document-Resource Mapping)
zs2020

Це повинно допомогти вам відповісти на ваш запит docs.mongodb.org/ecosystem/drivers/php-libraries
Basav

Існує бібліотека під назвою mongolia, яка дозволяє взаємодіяти з об’єктами mongo за допомогою атрибутів або доступу до словника та має перевірку схеми, яку ви можете ввімкнути: github.com/zagaran/mongolia
Zags,

@zsong Relational and Document ... Чи не слід називати Object Relational і Object 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
AFAIK. Ви не можете додавати властивості на льоту в Документ монгоінжинера. Який вид приносить трохи задоволення від mongodb.
Тутука

9
За необхідності ви можете використовувати DictField для додавання будь-яких абсолютно безсхемних даних.
neuman

Або GenericEmbeddedDocument?
tunnuz

У Mongoengine є кілька серйозних проблем із продуктивністю. Якщо ви хочете використовувати його у виробництві, це спрацює лише у тому випадку, якщо у вас дуже проста, легка схема.
Валері Р. Коффман,

3
Для тих, хто шукає більш повний огляд ORM MongoDB, доступних для Python, сторінка PyMongo «Інструменти» перелічує чимало з них і регулярно підтримується: api.mongodb.com/python/current/tools.html
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

1
Це надзвичайно корисно і просто, я просто хотів чогось, щоб я не застряг у створенні словників, нічого іншого.
vishalv2050

1
Це справді приємно. Шкода, що його більше не підтримують :(
якщо __name__ не має значення

30

Ви хочете MongoKit . Це на один шар абстракції вище, ніж PyMongo . Не впевнений, що ви використовуєте Django, але існує також інтеграція django-mongokit .

Приклад із цього допису в блозі . Зверніть увагу, що екземпляри Комп’ютера можуть безпосередньо посилатись на марку / модель безпосередньо після визначення структури (наприклад, 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 ви можете використовувати карти.
Тіммі

більше хірургічних змін. підтримує чистий графік вашої залежності. має сенс, хоча я не бачу способу зробити це безпосередньо. Може щось дивне, як клас MongoComputer (Комп’ютер, Документ) або з якоюсь формою змішування? Цікаво ...
Райан Кокс,

його чисто в sqlalchemy, отже, питання, ніж,
Тіммі

Без змін коду в монгокіті з 2015 року і жодного випуску з 2014 року.
Блін

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's model.py, і створити сценарії міграції за допомогою Ming.
Варад
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.