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.
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?
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
classMyObject(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
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:
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 :(.
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.
Réponses:
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()
la source
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
la source
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']}, ]
la source
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):
la source