micromongo เป็นชั้นเล็ก ๆ รอบ pymongo ที่ช่วยให้คุณสามารถสร้างการเรียนการออมในรูปแบบง่ายๆที่สามารถดำเนินการตรวจสอบให้จุดการเข้าถึงเอกสารผล queryset อัตโนมัติห่อและให้คุณก่อน / หลังบันทึกตะขอ
มันออกแบบมาด้วย microframeworks ในใจ แต่เป็นโปรแกรมและกรอบไม่เชื่อเรื่องพระเจ้า มันมีความหมายเพื่อให้ง่ายต่อการใช้งานของ pymongo และมีเครื่องมือสำหรับสำนวนร่วมกันที่จะไม่ปิดบัง pymongo หรือ MongoDB จากโครงสร้างข้อมูลของคุณ
คุณจะยินดีที่จะเปิดประเด็นหรือส่งคำขอดึง GitHub micromongo ของ
micromongo ทำให้ตัดสินใจในการออกแบบไม่กี่ในนามของความเรียบง่ายที่อาจจะไม่ทำงานสำหรับคุณ:
& nbsp; - & nbsp; micromongo รักษาเชื่อมต่อทั่วโลกเดียวดังนั้นคุณไม่สามารถมีรูปแบบที่เชื่อมต่อไปยังเซิร์ฟเวอร์ MongoDB หลาย
& nbsp; - & nbsp; มี handfull ของชื่อรุ่นและชื่อแอตทริบิวต์เอกสารที่จะไม่ทำงานกับรุ่น micromongo; เหล่านี้จะได้รับการคุ้มครองในเอกสารเต็มรูปแบบ
& nbsp; - & nbsp; คุณสามารถมีรูปแบบหนึ่งต่อคอลเลกชัน
การเริ่มต้น
เพื่อเริ่มต้นด้วย micromongo เพียงนำเข้า:
>>> จากการนำเข้า micromongo เชื่อมต่อรุ่น
>>> c = เชื่อมต่อ ()
การเชื่อมต่อใช้อาร์กิวเมนต์เช่นเดียวกับการเชื่อมต่อวัตถุ pymongo และพฤติกรรมที่เกือบจะเหมือนกันยกเว้นว่ามันพยายามที่จะกลับมาโดยอัตโนมัติผลแบบสอบถามห่อในชั้นเรียนรุ่นที่เหมาะสม วัตถุการเชื่อมต่อที่คุณสร้างขึ้นผ่านทางสายนี้จะถูกเก็บไว้และใช้สิ่งอำนวยความสะดวกต่างๆออมสไตล์เช่น Model.save () Model.proxy ฯลฯ หากคุณต้องการทำความสะอาดวัตถุการเชื่อมต่อมาตรฐานคุณจะได้รับหนึ่งได้อย่างง่ายดาย :
>>> จากการนำเข้า micromongo clean_connection
>>> สะอาด clean_connection = ()
โปรดทราบว่า clean_connection ไม่ใช้ข้อโต้แย้งและมักจะกลับชั้นเชื่อมต่อทำความสะอาดด้วยการตั้งค่าเช่นเดียวกับการเชื่อมต่อ micromongo ปัจจุบัน
ด้วยวัตถุการเชื่อมต่อเหล่านี้คุณสามารถสร้างฐานข้อมูลหรือทำสิ่งที่คุณจะมีวัตถุ pymongo ปกติ:
>>> dB = c.test_db
>>> คอลเลกชัน = db.test_collection
>>> collection.save ({"docid" 1 "ล้มเหลว" เท็จ})
>>> collection.find_one ()
{u'_id ': ObjectId (' ... '), u'fail' เท็จ u'docid ': 1}
นอกจากนี้คุณยังสามารถประกาศรุ่นของคุณเองสำหรับคอลเลกชันโดยเฉพาะอย่างยิ่งในรูปแบบที่ประกาศ:
>>> ชั้น TestModel (Model):
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; คอลเลกชัน = 'test_db.test_collection'
>>> collection.find_one ()
ชั้นเรียนเหล่านี้มีจำนวนของคุณลักษณะเพิ่มเติมกว่าพจนานุกรมที่สามารถทำให้พวกเขามากสะดวกในการใช้ คีย์เอกสารทั้งหมดสามารถเข้าถึงแอตทริบิวต์:
>>> t = collection.find_one ()
>>> t.fail
เท็จ
>>> t.docid
1
เอกสารที่ยังคงอยู่ได้อย่างง่ายดายเพื่อระบบฐานข้อมูล:
>>> t.docid = 17
>>> t.save ()
>>> clean.test_db.test_collection.find_one ()
{u'_id ': ObjectId (' ... '), u'fail' เท็จ u'docid ': 17}
การกำหนดรูปแบบ
ข้างต้นแอตทริบิวต์คอลเลกชันได้รับมอบหมายให้แบบฟูของเรา นี่คือทางลัด, แม้ว่า; ถ้าฐานข้อมูลและการจัดเก็บที่ได้รับมอบหมายแยกรุ่นสามารถคิดออกชื่อคอลเลกชันเต็มรูปแบบ หากคอลเลกชันและฐานข้อมูลไม่ได้ปัจจุบัน micromongo พยายามที่จะคิดออกอยู่บนพื้นฐานของการเรียนและชื่อโมดูลรุ่นของคุณ ยกตัวอย่างเช่น blog.Post จะกลายเป็น blog.post หรือ stream.StreamEntry จะกลายเป็น stream.stream_entry อย่างชัดเจนจะดีกว่าโดยปริยายและจะได้รับการสนับสนุนที่คุณตั้งค่าการเก็บรวบรวมด้วยตนเอง
นอกจากนี้การบรรจุและการเอาออกผลจากฐานข้อมูลแบบจำลองยังสามารถกำหนดเอกสารข้อมูลจำเพาะซึ่งสามารถกำหนดค่าเริ่มต้นและดำเนินการตรวจสอบก่อนที่จะบันทึกรูปแบบ ใช้บล็อกเล็ก ๆ น้อย ๆ แบบโพสต์:
>>> จากการนำเข้า micromongo.spec *
>>> ชั้นโพสต์ (Model):
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; คอลเลกชัน = 'test_db.blog_posts'
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; ข้อมูลจำเพาะ = Dict (
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; ผู้เขียน = ฟิลด์ (จำเป็น = True เริ่มต้น = 'jmoiron' type = basestring)
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; title = ฟิลด์ (จำเป็น = เท็จเริ่มต้น = '' พิมพ์ = basestring)
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; ตีพิมพ์ = ฟิลด์ (จำเป็น = True เริ่มต้น = เท็จพิมพ์ = [ทรูเท็จ])
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; ร่างกาย = ฟิลด์ (type = Unicode)
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; timestamp = ฟิลด์ ()
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; )
>>> p = Post.new ()
>>> P
<โพสต์: {'ชื่อ' U '', 'ผู้เขียน': u'jmoiron ',' ตีพิมพ์ 'เท็จ}>
บางสิ่งที่จะเกิดขึ้นที่นี่ เขตข้อมูลที่มีการเริ่มต้นจะเริ่มต้นที่จะเริ่มต้นที่ว่าพวกเขาจะต้องหรือไม่ หากข้อมูลที่จำเป็นไม่ได้มีการเริ่มต้นก็เริ่มต้นได้ที่ไม่มี
ฟิลด์สามารถใช้อาร์กิวเมนต์ชนิดซึ่งสามารถเป็นได้ทั้ง callable ที่เกิดมูลค่าและผลตอบแทนจริงหรือเท็จอย่างใดอย่างหนึ่งหรือหลายชนิดฐานหรือหนึ่งหรือค่าอื่น ๆ อีกมากมาย หากหนึ่งหรือมากกว่าจะมีประเภทให้ isinstance จะใช้ในการทดสอบว่าค่าประเภทสิทธิ หากหนึ่งหรือมากกว่าจะมีค่าให้ทำหน้าที่เป็นฟิลด์ชนิด enum ตรวจสอบว่าค่าอยู่ในชุดของค่า ถ้าชนิดไม่ได้รับการตรวจสอบมักจะผ่านไปบนสนามจนกว่าจะมีการที่จำเป็นและขาด
ถ้าเขตข้อมูลในพีจะได้รับชนิดที่ไม่ถูกต้องแล้ว ValueError จะเพิ่มขึ้น:
>>> p.title = 10
>>> P.SAVE ()
Traceback (โทรล่าสุดที่ผ่านมา):
& nbsp; ...
ValueError: คีย์ไม่ตรงกับสเปค: ['ชื่อ']
>>> เด p.author
>>> P.SAVE ()
Traceback (โทรล่าสุดที่ผ่านมา):
& nbsp; ...
ValueError: สาขาที่หายไป: ['ผู้เขียน'] เขตข้อมูลไม่ถูกต้อง: ['ชื่อ']
>>> p.title = 'blogpost ครั้งแรกของฉัน'
>>> p.author = 'jmoiron'
>>> p.published = True
>>> p.body u = "นี่คือบล็อกโพสต์ครั้งแรกของฉัน .. & nbsp; ฉันตื่นเต้นมาก!"
>>> P.SAVE ()
Model.find
เพื่อความสะดวกและแห้ง Model.find เป็น classmethod ที่จะใช้เคอร์เซอร์ micromongo ที่จะออกพบกับคอลเลกชันที่เหมาะสม วิธีการนี้จะทำงานเหมือนกับ Collection.find pymongo ของ
micromongo ของการแก้ไขเล็กน้อยชั้นเคอร์เซอร์ยังทำให้วิธี order_by django แรงบันดาลใจที่มีให้กับเคอร์เซอร์ทั้งหมด (ค้นหาและสิ่งที่คุณโซ่ออกถ้ามันกลับเคอร์เซอร์) คุณสามารถส่งผ่านหนึ่งหรือมากกว่าหนึ่งชื่อฟิลด์ที่มีตัวเลือกชั้นนำ '-' ในการจัดเรียงสิ่งโดยลำดับขึ้นหรือลง
การเปลี่ยนแปลงเหล่านี้ช่วยให้คุณสามารถใช้ส่วนใหญ่ของพลังของ pymongo ได้โดยไม่ต้องนำเข้ามันและช่วยให้คุณหลีกเลี่ยงการทำซ้ำความจำเป็นของสถานที่ตั้งของข้อมูลของคุณ
ข้อมูล subclassing
คุณได้รับการสนับสนุนในการสร้างเขตข้อมูลของคุณเองที่ทำในสิ่งที่คุณต้องการ subclasses สนามมี pre_validate ฟังก์ชันเบ็ดซึ่งใช้ค่าที่เข้ามาและสามารถเปลี่ยนมัน แต่ที่พวกเขาต้องการ โปรดทราบว่านี้จะทำงานถ้าเขตข้อมูลที่เป็นจริงในปัจจุบัน; เพื่อที่จะได้รับสิ่งที่ต้องการใน auto_now_add DateTimeField คุณจะต้องการที่จะทำให้มันจำเป็นและมี pre_validate มันเปิดไม่เป็น datetime.datetime.now ()
ต้องการ .
- หลาม
ความคิดเห็นที่ไม่พบ