MongoDB ORM cho Python? [đóng cửa]


85

Tôi đang cố gắng chuyển từ sqlalchemy (SQlite) sang sử dụng mongodb. Tôi muốn xác định sơ đồ. Tôi đang xem mongokit, nhưng tôi muốn một cái gì đó tương tự như những người lập bản đồ, để nó lưu từ thuộc tính của đối tượng chứ không phải là một dict.

tôi muốn một người lập bản đồ để tôi có thể sử dụng các đối tượng hiện có mà không cần sửa đổi chúng.


1
Chính xác, nó nên được gọi là "DRM" (Document-Resource-Mapping)
zs2020

Điều này sẽ giúp bạn trả lời truy vấn của mình docs.mongodb.org/ecosystem/drivers/php-libraries
Basav 29/09/13

Có một thư viện được gọi là mongolia cho phép bạn tương tác với các đối tượng mongo thông qua thuộc tính hoặc quyền truy cập từ điển và có xác minh giản đồ mà bạn có thể bật: github.com/zagaran/mongolia
Zags

@zsong Relational and Document ... Không nên được gọi là Object Relational and Object Document?
Jaime Sangcap

điều này có thể hữu ích: pythonhosted.org/Flask-MongoAlchemy
Xiao

Câu trả lời:


69

Một tùy chọn khác là MongoEngine . ORM cho MongoEngine rất giống với ORM được Django sử dụng.

Ví dụ (từ hướng dẫn):

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
THÔI. Bạn không thể thêm thuộc tính nhanh chóng vào Tài liệu của mongoengine. Loại nào lấy đi một số niềm vui từ mongodb.
tutuca

9
Bạn có thể sử dụng DictField để thêm bất kỳ loại dữ liệu hoàn toàn không có toán học nào nếu bạn cần.
neuman

Hoặc GenericEmbeddedDocument?
tunnuz

Mongoengine có một số vấn đề về hiệu suất nghiêm trọng. Nếu bạn muốn sử dụng nó trong sản xuất, nó sẽ chỉ hoạt động nếu bạn có một lược đồ rất đơn giản, nhẹ.
Valerie R. Coffman

3
Đối với những người đang tìm kiếm tổng quan toàn diện hơn về các ORM MongoDB có sẵn cho Python, trang "Công cụ" của PyMongo liệt kê khá nhiều trong số chúng và được duy trì thường xuyên: api.mongodb.com/python/current/tools.html
Ascendant

40

Không hài lòng với MongoKit hoặc MongoEngine, tôi quyết định viết giao diện hướng đối tượng của riêng mình cho Python.

Tôi đã ủy quyền trực tiếp tất cả các truy vấn cho pymongo, vì vậy cú pháp truy vấn ở đó giống nhau. Hầu hết, nó chỉ là một trình bao bọc đối tượng xung quanh kết quả, với một số trợ giúp khác như tổng hợp kết nối cơ sở dữ liệu, hỗ trợ DBRef và các phương pháp tiện lợi khác để giúp cuộc sống của bạn dễ dàng hơn.

Nó được gọi là Minimongo và nó có sẵn trên github. Chúc bạn hack vui vẻ!

Thí dụ:

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
Điều này siêu hữu ích và đơn giản, tôi chỉ muốn một cái gì đó để tôi không gặp khó khăn trong việc tạo từ điển, không có gì khác.
vishalv2050

1
Điều này thực sự tốt đẹp. Thật tệ là nó không còn được duy trì nữa :(
if __name__ is None

30

Bạn muốn MongoKit . Nó là một lớp trừu tượng cao hơn PyMongo . Không chắc bạn có đang sử dụng Django hay không nhưng cũng có tích hợp django-mongokit .

Ví dụ từ bài đăng trên blog này . Lưu ý rằng các trường hợp của Máy tính sau đó có thể tham chiếu trực tiếp make / model sau khi cấu trúc được xác định (ví dụ: atari.make, c64.model, ...). Không cần từ điển:

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

có cách nào để làm điều này mà không cần sửa đổi các đối tượng logic nghiệp vụ hiện có không? trong sqlalchemy, bạn có thể sử dụng trình lập bản đồ.
Timmy

thay đổi phẫu thuật nhiều hơn. giữ cho đồ thị phụ thuộc của bạn sạch sẽ. có lý, mặc dù tôi không thấy cách nào để làm điều này trực tiếp. Có thể một cái gì đó lạ như lớp MongoComputer (Máy tính, Tài liệu) hoặc với một số hình thức trộn lẫn? Thú vị ...
Ryan Cox

nó sạch sẽ trong sqlalchemy, do đó câu hỏi, thans
Timmy

Không có thay đổi mã nào trong mongokit kể từ năm 2015 và không có bản phát hành nào kể từ năm 2014. Mẹ kiếp, tôi không hiểu thế giới python này :(.
JAR.JAR.beans 14/08/18

15

Tôi biết mình thực sự muộn với câu hỏi này, nhưng tôi là tác giả của Ming http://merciless.sourceforge.net , một công cụ xác thực MongoDB và ORM lấy cảm hứng từ SQLAlchemy. Đó là những gì chúng tôi sử dụng tại SourceForge và có một bản trình bày hợp lý có sẵn tại http://www.slideshare.net/rick446/rapid-and-scalable-development-with-mongodb-pymongo-and-ming cũng như một nghiên cứu điển hình về di chuyển từ SQLAlchemy sang Ming http://www.slideshare.net/__amol__/from-sqlalchemy-to-ming-with-turbogears2 . Đây là một ví dụ về lớp ORM trong Ming (từ hướng dẫn):

class WikiPage(MappedClass):

    class __mongometa__:
        session = session
        name = 'wiki_page'

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

Các truy vấn sử dụng cú pháp truy vấn MongoDB chuẩn (không phải đối số từ khóa ma thuật của Django ORM):

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

Ming dường như cho chúng tôi con đường để đi. Nó có cả tính linh hoạt và các khái niệm giản đồ mà chúng ta cần. Khi cần điện, chúng tôi thả xuống pymongo.
jochem

1
Tôi chưa quen với mongo và python. Có hướng dẫn mà tôi có thể tham khảo để tạo Mô hình như model.py của django và tạo tập lệnh di chuyển bằng Ming không.
Varad
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.