MongoDB ORM สำหรับ Python? [ปิด]


85

ฉันพยายามย้ายจาก sqlalchemy (SQlite) ไปใช้ mongodb ฉันต้องการการกำหนดรูปแบบสคีมา ฉันกำลังมองหา mongokit แต่ฉันต้องการบางอย่างที่คล้ายกับ mappers เพื่อที่มันจะได้รับการบันทึกจากคุณสมบัติของวัตถุไม่ใช่คำสั่ง

ฉันต้องการผู้ทำแผนที่เพื่อให้ฉันสามารถใช้วัตถุที่มีอยู่ได้โดยไม่ต้องแก้ไข


1
อย่างแม่นยำควรเรียกว่า "DRM" (Document-Resource-Mapping)
zs2020

สิ่งนี้จะช่วยคุณตอบคำถามของคุณdocs.mongodb.org/ecosystem/drivers/php-libraries
Basav

มีห้องสมุดชื่อมองโกเลียที่ให้คุณโต้ตอบกับวัตถุ Mongo ผ่านแอตทริบิวต์หรือการเข้าถึงพจนานุกรมและมีการตรวจสอบสคีมาที่คุณสามารถเปิดใช้งานได้: github.com/zagaran/mongolia
Zags

@zsong Relational and Document ... ไม่ควรเรียกว่า Object Relational และ Object Document?
Jaime Sangcap

สิ่งนี้อาจเป็นประโยชน์: pythonhosted.org/Flask-MongoAlchemy
Xiao

คำตอบ:


69

ตัวเลือกหนึ่งคือ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()

16
AFAIK. คุณไม่สามารถเพิ่มคุณสมบัติได้ทันทีในเอกสารของ Mongoengine แบบไหนที่สนุกไปกับ mongodb
tutuca

10
คุณสามารถใช้ DictField เพื่อเพิ่มข้อมูลที่ไม่มีสคีมาทั้งหมดได้หากต้องการ
neuman

หรือ GenericEmbeddedDocument?
tunnuz

Mongoengine มีปัญหาด้านประสิทธิภาพที่ร้ายแรง หากคุณต้องการใช้ในการผลิตจะใช้งานได้ก็ต่อเมื่อคุณมีสคีมาที่เรียบง่ายและมีน้ำหนักเบา
Valerie R.Coffman

3
สำหรับผู้ที่มองหาภาพรวม MongoDB ORM ที่ครอบคลุมมากขึ้นสำหรับ Python หน้า "Tools" ของ PyMongo จะแสดงรายการเครื่องมือเหล่านี้จำนวนไม่มากนักและได้รับการดูแลเป็นประจำ: api.mongodb.com/python/current/tools.html
ลัคนา

40

ไม่พอใจกับ 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

1
สิ่งนี้มีประโยชน์และเรียบง่ายมากฉันแค่ต้องการบางอย่างเพื่อที่ฉันจะได้ไม่ติดอยู่กับการสร้างพจนานุกรมไม่มีอะไรอื่น
vishalv2050

1
นี่เป็นสิ่งที่ดีจริงๆ เสียดายที่มันไม่ได้รับการดูแลอีกต่อไป :(
ถ้า __name__ คือไม่มี

30

คุณต้องการMongoKit มันเป็นหนึ่งในชั้นที่สูงขึ้นกว่าที่เป็นนามธรรมPyMongo ไม่แน่ใจว่าคุณใช้ Django หรือไม่ แต่ก็มีการรวมdjango-mongokitด้วย

ตัวอย่างจากบล็อกโพสต์นี้ โปรดทราบว่าอินสแตนซ์ของคอมพิวเตอร์สามารถอ้างอิงยี่ห้อ / รุ่นได้โดยตรงเมื่อมีการกำหนดโครงสร้าง (เช่น 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']}, 
    ]

มีวิธีดำเนินการโดยไม่ต้องแก้ไขวัตถุตรรกะทางธุรกิจที่มีอยู่หรือไม่ ใน sqlalchemy คุณสามารถใช้ mappers
Timmy

การเปลี่ยนแปลงทางศัลยกรรมมากขึ้น ทำให้กราฟการอ้างอิงของคุณสะอาด ก็สมเหตุสมผลดีแม้ว่าฉันจะไม่เห็นวิธีที่จะทำสิ่งนี้โดยตรง อาจจะมีอะไรแปลก ๆ เช่นคลาส MongoComputer (คอมพิวเตอร์, เอกสาร) หรือมีการผสมผสานบางรูปแบบ? น่าสนใจ ...
Ryan Cox

มันสะอาดใน sqlalchemy ดังนั้นคำถาม thans
Timmy

ไม่มีการเปลี่ยนแปลงรหัสใน mongokit ตั้งแต่ปี 2015 และไม่มีการเปิดตัวตั้งแต่ปี 2014 ไอ้ฉันไม่ได้รับโลก python นี้ :(
JAR.JAR.beans

15

ฉันรู้ว่าฉันมาสายจริงๆสำหรับคำถามนี้ แต่ฉันเป็นผู้เขียน Ming http://merciless.sourceforge.netซึ่งเป็นเครื่องมือตรวจสอบ MongoDB ที่ได้รับแรงบันดาลใจจาก SQLAlchemy และ ORM นี่คือสิ่งที่เราใช้ใน SourceForge และมีการนำเสนอที่สมเหตุสมผลที่http://www.slideshare.net/rick446/rapid-and-scalable-development-with-mongodb-pymongo-and-mingรวมทั้งกรณีศึกษาเกี่ยวกับ ย้ายจาก SQLAlchemy จะหมิง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)

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

หมิงดูเหมือนว่าเราจะไป มีทั้งความยืดหยุ่นและแนวคิดของสคีมาที่เราต้องการ เมื่อเราต้องการพลังเราจะปล่อยลงไปที่ pymongo
jochem

1
ฉันยังใหม่กับ Mongo และ Python มีบทช่วยสอนที่ฉันสามารถอ้างถึงในการสร้างโมเดลเช่น model.py ของ django และสร้างสคริปต์การย้ายข้อมูลโดยใช้ Ming
Varad
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.