MongoDB ORM pour Python? [fermé]

85

J'essaie de migrer de sqlalchemy (SQlite) vers l'utilisation de mongodb. Je voudrais une vertification de schéma. Je suis en train de regarder mongokit, mais je veux quelque chose qui est similaire aux mappeurs, afin qu'il sauve de la propriété de l'objet, et non un dict.

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

Timmy
la source
1
Précisément, il devrait être appelé "DRM" (Document-Resource-Mapping)
zs2020
Cela devrait vous aider à répondre à votre requête docs.mongodb.org/ecosystem/drivers/php-libraries
Basav
Il existe une bibliothèque appelée mongolie qui vous permet d'interagir avec les objets mongo via des attributs ou un accès au dictionnaire et dispose d'une vérification de schéma que vous pouvez activer: github.com/zagaran/mongolia
Zags
@zsong Relational and Document ... Ne devrait pas être appelé Object Relational et Object Document?
Jaime Sangcap
cela peut être utile: pythonhosted.org/Flask-MongoAlchemy
Xiao

Réponses:

69

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()
David Narayan
la source
16
AUTANT QUE JE SACHE. Vous ne pouvez pas ajouter de propriétés à la volée au document de mongoengine. Ce qui enlève du plaisir à mongodb.
tutuca
9
Vous pouvez utiliser le DictField pour ajouter tout type de données totalement sans schéma si vous en avez besoin.
neuman
Ou le GenericEmbeddedDocument?
tunnuz
Mongoengine a de sérieux problèmes de performances. Si vous souhaitez l'utiliser en production, cela ne fonctionnera que si vous disposez d'un schéma très simple et léger.
Valerie R. Coffman
3
Pour ceux qui recherchent un aperçu plus complet des ORM MongoDB disponibles pour Python, la page "Outils" de PyMongo en répertorie plusieurs, et est régulièrement maintenue: api.mongodb.com/python/current/tools.html
Ascendant
40

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 de requête est la même. La plupart du temps, il ne s'agit que d'un wrapper d'objets autour des résultats, avec d'autres aides comme le pool de connexions de base de données, la prise en charge de DBRef et d'autres méthodes pratiques pour vous simplifier la vie.

Il s'appelle Minimongo et est disponible sur github. Bon piratage!

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
slacy
la source
1
C'est super utile et simple, je voulais juste quelque chose pour ne pas être coincé dans la création de dictionnaires, rien d'autre.
vishalv2050
1
C'est vraiment sympa. Dommage qu'il ne soit plus maintenu :(
si __name__ est None
30

Vous voulez MongoKit . C'est une couche d'abstraction plus élevée que PyMongo . Je ne sais pas si vous utilisez Django, mais il existe également une intégration django-mongokit .

Exemple tiré de ce billet de blog . Notez que les instances de Computer peuvent alors référencer directement make / model une fois la structure 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']}, 
    ]
Ryan Cox
la source
existe-t-il un moyen de le faire sans modifier les objets de logique métier existants? dans sqlalchemy, vous pouvez utiliser des mappeurs.
Timmy
plus de changement chirurgical. garde votre graphique de dépendances propre. a du sens, même si 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 forme de mixage? Intéressant ...
Ryan Cox
son propre dans sqlalchemy, donc la question, que
Timmy
Aucun changement de code dans mongokit depuis 2015 et aucune version depuis 2014. putain, je ne comprends pas ce monde python :(.
JAR.JAR.beans
15

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 MongoDB et ORM inspiré de SQLAlchemy. C'est ce que nous utilisons chez SourceForge, et il y a une présentation raisonnable disponible à http://www.slideshare.net/rick446/rapid-and-scalable-development-with-mongodb-pymongo-and-ming ainsi qu'une étude de cas sur 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 (à partir 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 de requête MongoDB standard (et non les arguments de mots clés magiques de Django ORM):

WikiComment.query.find(dict(page_id=wp._id))
Rick Copeland
la source
Ming nous semble la voie à suivre. Il a à la fois la flexibilité et les concepts schématisés dont nous avons besoin. Lorsque nous avons besoin de puissance, nous passons au pymongo.
jochem
1
Je suis nouveau sur mongo et python. Existe-t-il un tutoriel auquel je peux me référer pour créer des modèles comme le model.py de django et créer des scripts de migration à l'aide de Ming.
Varad