Я пытаюсь перейти с sqlalchemy (SQlite) на использование mongodb. Я хочу подтверждение схемы. Я смотрю на mongokit, но мне нужно что-то похожее на mappers, чтобы оно сохранялось из свойства объекта, а не dict.
Мне нужен картограф, чтобы я мог использовать существующие объекты, не изменяя их.
Есть библиотека под названием mongolia, которая позволяет вам взаимодействовать с объектами mongo с помощью атрибутов или доступа к словарю и имеет возможность проверки схемы, которую вы можете включить: github.com/zagaran/mongolia
Zags
@zsong Relational and Document ... Не следует называть объектно-реляционным и объектным документом?
НАСКОЛЬКО МНЕ ИЗВЕСТНО. Вы не можете добавлять свойства на лету в документ 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
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
Это супер полезно и просто, я просто хотел что-то, чтобы не зацикливаться на создании словарей, ничего больше.
vishalv2050
1
Это действительно здорово. Жаль, что его больше не обслуживают :(
if __name__ is None
30
Вам нужен MongoKit . Это на один уровень абстракции выше, чем PyMongo . Не уверен, что вы используете Django, но есть также интеграция с django-mongokit .
Пример из этого сообщения в блоге . Обратите внимание, что экземпляры Computer могут напрямую ссылаться на make / model после определения структуры (например, atari.make, c64.model, ...). Словари не нужны:
есть ли способ сделать это без изменения существующих объектов бизнес-логики? в sqlalchemy вы можете использовать mappers.
Тимми
больше хирургических изменений. сохраняет ваш граф зависимостей чистым. имеет смысл, хотя я не вижу способа сделать это напрямую. Может быть, что-то странное вроде класса MongoComputer (Computer, Document) или с какой-то смесью? Интересно ...
Райан Кокс
его чистый в sqlalchemy, поэтому вопрос, thans
Тимми
Никаких изменений кода в mongokit с 2015 года и ни одного выпуска с 2014 года. Черт, я не понимаю этот мир питонов :(.
Мин кажется нам правильным путем. Он обладает как гибкостью, так и схематичными концепциями, которые нам нужны. Когда нам нужна энергия, мы спускаемся в пимонго.
jochem
1
Я новичок в монго и питоне. Есть ли учебник, к которому я могу обратиться для создания таких моделей, как django model.py, и создания сценариев миграции с использованием Ming.
Ответы:
Другой вариант - 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()
источник
Не удовлетворившись ни 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
источник
Вам нужен 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']}, ]
источник
Я знаю, что действительно опаздываю с этим вопросом, но я автор 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):
источник