94 votes

MongoDB ORM pour Python ?

J'essaie de migrer de sqlalchemy(SQlite) vers mongodb. Je voudrais une verticalisation des schémas. Je suis en train de regarder mongokit, mais je veux quelque chose qui est similaire à mappers, de sorte qu'il serait enregistrer à partir de la propriété de l'objet, et non un dict.

je voudrais un mappeur pour pouvoir utiliser des objets existants sans les modifier.

1 votes

Précisément, il devrait s'appeler "DRM" (Document-Resource-Mapping).

0 votes

Cela devrait vous aider à répondre à votre question docs.mongodb.org/ecosystem/drivers/php-libraries

0 votes

Il existe une bibliothèque appelée mongolia qui vous permet d'interagir avec les objets Mongo par le biais d'attributs ou d'un accès par dictionnaire et qui possède une vérification de schéma que vous pouvez activer : github.com/zagaran/mongolie

76voto

David Narayan Points 1550

Une autre option est MongoEngine . L'ORM de MongoEngine est très similaire à l'ORM utilisé par Django.

Exemple (tiré du tutoriel) :

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 votes

AFAIK. Vous ne pouvez pas ajouter des propriétés à la volée au document de mongoengine. Ce qui enlève un peu de plaisir à mongodb.

10 votes

Vous pouvez utiliser le DictField pour ajouter n'importe quel type de données totalement dépourvues de schéma si vous en avez besoin.

0 votes

Ou le GenericEmbeddedDocument ?

41voto

slacy Points 4417

N'étant satisfait ni de MongoKit ni de MongoEngine, j'ai décidé d'écrire ma propre interface orientée objet pour Python.

J'ai délégué toutes les requêtes directement à pymongo, donc la syntaxe des requêtes y est la même. La plupart du temps, il s'agit juste d'un objet enveloppant les résultats, avec quelques autres aides comme la mise en commun des connexions à la base de données, le support de DBRef, et d'autres méthodes pratiques pour vous faciliter la vie.

Ça s'appelle Minimongo et il est disponible sur github. Bon bricolage !

Exemple :

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 votes

C'est super utile et simple, je voulais juste quelque chose pour ne pas être coincé à créer des dictionnaires, rien d'autre.

1 votes

C'est vraiment bien. Dommage qu'il ne soit plus entretenu :(

31voto

Ryan Cox Points 3397

Vous voulez MongoKit . Il s'agit d'une couche d'abstraction supérieure à PyMongo . Je ne sais pas si vous utilisez Django, mais il y a également django-mongokit l'intégration.

Exemple de ce qui suit article de blog . Notez que les instances de Computer peuvent alors faire référence à la marque ou au modèle directement une fois que la structure est définie (par exemple atari.make, c64.model, ...). Pas besoin de dictionnaires :

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']}, 
    ]

0 votes

Existe-t-il un moyen de faire cela sans modifier les objets de logique commerciale existants ? dans sqlalchemy, vous pouvez utiliser des mappeurs.

0 votes

Plus de changement chirurgical. garde votre graphe de dépendance propre. c'est logique, bien que je ne vois pas de moyen de le faire directement. Peut-être quelque chose d'étrange comme la classe MongoComputer(Computer,Document) ou avec une certaine forme de mélange ? Intéressant...

0 votes

Son propre dans sqlalchemy, donc la question, thans

15voto

Rick Copeland Points 5343

Je sais que je suis vraiment en retard pour cette question, mais je suis l'auteur de "Ming". http://merciless.sourceforge.net un moteur de validation et ORM MongoDB inspiré de SQLAlchemy. C'est ce que nous utilisons à SourceForge, et une présentation raisonnable est disponible à l'adresse suivante http://www.slideshare.net/rick446/rapid-and-scalable-development-with-mongodb-pymongo-and-ming ainsi qu'une étude de cas sur la migration de SQLAlchemy vers Ming. http://www.slideshare.net/__amol__/from-sqlalchemy-to-ming-with-turbogears2 . Voici un exemple de la couche ORM dans Ming (tiré du tutoriel) :

class WikiPage(MappedClass):

    class __mongometa__:
        session = session
        name = 'wiki_page'

    _id = FieldProperty(schema.ObjectId)
    title = FieldProperty(str)
    text = FieldProperty(str)
    comments=RelationProperty('WikiComment')

Les requêtes utilisent la syntaxe standard des requêtes MongoDB (et non les arguments magiques des mots-clés de l'ORM de Django) :

WikiComment.query.find(dict(page_id=wp._id))

0 votes

Ming semble pour nous la voie à suivre. Il possède à la fois la flexibilité et les concepts de type schéma dont nous avons besoin. Lorsque nous avons besoin de puissance, nous descendons à pymongo.

1 votes

Je suis novice en matière de Mongo et de Python. Existe-t-il un tutoriel auquel je puisse me référer pour créer des modèles comme le model.py de django et créer des scripts de migration en utilisant Ming.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X