zope.generations

ภาพหน้าจอของซอฟแวร์:
zope.generations
รายละเอียดซอฟแวร์:
รุ่น: 4.0.0 Alpha 1
วันที่อัพโหลด: 15 Apr 15
ผู้พัฒนา: Zope Corporation and Contributors
การอนุญาต: ฟรี
ความนิยม: 2

Rating: nan/5 (Total Votes: 0)

zope.generations มีวิธีการปรับปรุงวัตถุในฐานข้อมูลเมื่อมีการเปลี่ยนแปลงสคีมาประยุกต์ใช้ & nbsp;. คีมาประยุกต์ใช้เป็นหลักโครงสร้างของข้อมูลโครงสร้างของชั้นเรียนในกรณีของ ZODB หรือรายละเอียดตารางในกรณีของ ฐานข้อมูลเชิงสัมพันธ์
เอกสารรายละเอียด
รุ่นมีวิธีการปรับปรุงวัตถุในฐานข้อมูลเมื่อมีการเปลี่ยนแปลงสคีมาประยุกต์ใช้ คีมาประยุกต์ใช้เป็นหลักโครงสร้างของข้อมูลโครงสร้างของชั้นเรียนในกรณีของ ZODB หรือรายละเอียดตารางในกรณีของฐานข้อมูลเชิงสัมพันธ์
เมื่อคุณเปลี่ยนโครงสร้างข้อมูลโปรแกรมประยุกต์ของคุณตัวอย่างเช่นคุณเปลี่ยนความหมายของข้อมูลที่มีอยู่ในชั้นเรียนของคุณจะมีปัญหากับฐานข้อมูลที่ถูกสร้างขึ้นก่อนการเปลี่ยนแปลงของคุณ สำหรับการอภิปรายอย่างละเอียดมากขึ้นและการแก้ปัญหาเป็นไปได้ดู http://wiki.zope.org/zope3/DatabaseGenerations
เราจะใช้องค์ประกอบสถาปัตยกรรมและเราจะต้องมีฐานข้อมูลและการเชื่อมต่อ:
& nbsp; >>> นำเข้า cgi
& nbsp; >>> จากการนำเข้า pprint pprint
& nbsp; >>> จากการดำเนินการนำเข้า zope.interface
& nbsp; >>> จาก ZODB.tests.util นำเข้า DB
& nbsp; >>> dB = DB ()
& nbsp; >>> conn = db.open ()
& nbsp; >>> ราก = conn.root ()
ลองจินตนาการว่าโปรแกรมของเราเป็น oracle: คุณสามารถสอนให้ตอบสนองต่อวลี ขอให้มันง่ายและการจัดเก็บข้อมูลใน Dict:
& nbsp; >>> ราก ['คำตอบ'] = {'สวัสดี': '? Hi และคุณจะทำอย่างไร'
& nbsp; ... 'ความหมายของชีวิต': '42',
& nbsp; ... สี่ & nbsp; >>> การทำธุรกรรมการนำเข้า
& nbsp; >>> transaction.commit ()
ตั้งค่าเริ่มต้น
นี่คือบางส่วนรหัสรุ่นเฉพาะของ เราจะสร้างและลงทะเบียน SchemaManager SchemaManagers มีความรับผิดชอบในการปรับปรุงที่เกิดขึ้นจริงของฐานข้อมูล อันนี้จะเป็นเพียงหุ่น จุดที่นี่คือการทำให้คนรุ่นโมดูลทราบว่าโปรแกรมของเราจะสนับสนุนการสร้าง
เริ่มต้นใช้ SchemaManager ไม่เหมาะสำหรับการทดสอบนี้เพราะมันใช้โมดูลหลามในการจัดการรุ่น สำหรับตอนนี้มันจะเป็นเพียงแค่ปรับเนื่องจากเราไม่ต้องการที่จะทำอะไรเพียง แต่
& nbsp; >>> นำเข้าจาก zope.generations.interfaces ISchemaManager
& nbsp; >>> นำเข้าจาก zope.generations.generations SchemaManager
& nbsp; >>> นำเข้า zope.component
& nbsp; >>> dummy_manager = SchemaManager (minimum_generation = 0, รุ่น = 0)
& nbsp; >>> zope.component.provideUtility (
& nbsp; ... dummy_manager, ISchemaManager ชื่อ = 'some.app')
'some.app' เป็นตัวระบุที่ไม่ซ้ำกัน คุณควรใช้ URI หรือชื่อประของแพคเกจของคุณ
เมื่อคุณเริ่ม Zope และฐานข้อมูลที่มีการเปิด, IDatabaseOpenedWithRoot เหตุการณ์จะถูกส่ง Zope ลงทะเบียน evolveMinimumSubscriber โดยค่าเริ่มต้นเป็นตัวจัดการสำหรับเหตุการณ์นี้ ลองจำลองนี้
& nbsp; >>> ชั้น DatabaseOpenedEventStub (วัตถุ):
& nbsp; ... def __init __ (ตัวเองฐานข้อมูล):
& nbsp; ... self.database ฐานข้อมูล =
& nbsp; >>> เหตุการณ์ = DatabaseOpenedEventStub (DB)
& nbsp; >>> นำเข้าจาก zope.generations.generations evolveMinimumSubscriber
& nbsp; >>> evolveMinimumSubscriber (event) การ
ผลที่ตามมาของการกระทำนี้คือว่าตอนนี้ฐานข้อมูลมีความจริงที่ว่าจำนวนสคีปัจจุบันของเราคือ 0 เมื่อเราปรับปรุงสคี, Zope3 จะมีความคิดของสิ่งที่จุดเริ่มต้นคือ นี่เห็น?
& nbsp; >>> จาก zope.generations.generations นำเข้า generations_key
& nbsp; >>> ราก [generations_key] ['some.app']
& nbsp; 0
ในชีวิตจริงคุณไม่ควรต้องกังวลกับคีย์นี้โดยตรง แต่คุณควรทราบว่ามันมีอยู่
อัพเกรดสถานการณ์
กลับไปที่เรื่อง บางเวลาผ่านไปและเป็นหนึ่งในลูกค้าของเราได้รับการ hacked เพราะเราลืมที่จะหลบหนีตัวอักษรพิเศษ HTML! สยองขวัญ! เราต้องแก้ไขปัญหานี้โดยเร็วที่สุดโดยไม่สูญเสียข้อมูลใด ๆ เราตัดสินใจที่จะใช้รุ่นสร้างความประทับใจให้เพื่อนของเรา
ขอปรับปรุงผู้จัดการสคี (ลดลงเดิมและติดตั้งที่กำหนดเองใหม่หนึ่ง):
& nbsp; >>> จากการนำเข้า zope.component globalregistry
& nbsp; >>> แกรม = globalregistry.getGlobalSiteManager ()
& nbsp; >>> gsm.unregisterUtility (ให้ = ISchemaManager ชื่อ = 'some.app')
& nbsp; ที่แท้จริง
& nbsp; >>> ชั้น MySchemaManager (วัตถุ):
& nbsp; ... การดำเนินการ (ISchemaManager)
& nbsp; ...
& nbsp; ... minimum_generation = 1
& nbsp; ... รุ่น = 2
& nbsp; ...
& nbsp; ... def วิวัฒนาการ (ตัวเองบริบทรุ่น):
& nbsp; ... ราก = context.connection.root ()
& nbsp; ... คำตอบ = ราก ['คำตอบ']
& nbsp; ... ถ้ารุ​​่น == 1:
& nbsp; ... สำหรับคำถามคำตอบใน answers.items ():
& nbsp; ... คำตอบ [คำถาม] = cgi.escape (คำตอบ)
& nbsp; ... รุ่น elif == ที่ 2:
& nbsp; ... สำหรับคำถามคำตอบใน answers.items ():
& nbsp; ... คำตอบที่เดล [คำถาม]
& nbsp; ... คำตอบ [cgi.escape (คำถาม)] = คำตอบ
& nbsp; ... อื่น:
& nbsp; ... ยก ValueError ("น้องสอง")
& nbsp; ... ราก ['คำตอบ'] = ตอบ # ping ติดตา
& nbsp; ... transaction.commit ()
& nbsp; >>> ผู้จัดการ = MySchemaManager ()
& nbsp; >>> zope.component.provideUtility (ผู้จัดการ ISchemaManager ชื่อ = 'some.app')
เราได้ตั้ง minimum_generation 1. นั่นหมายความว่าโปรแกรมของเราจะปฏิเสธที่จะทำงานกับฐานข้อมูลเก่ากว่ารุ่น 1. แอตทริบิวต์รุ่นที่ถูกตั้งไว้ที่ 2 ซึ่งหมายความว่ารุ่นใหม่ล่าสุดที่ SchemaManager นี้รู้เกี่ยวกับการเป็น 2
วิวัฒนาการ () เป็นเทียมที่นี่ ในงานของตนคือการได้รับฐานข้อมูลจากรุ่น 1 ถึงรุ่น จะได้รับบริบทที่มีแอตทริบิวต์ 'เชื่อมต่อ' ซึ่งเป็นการเชื่อมต่อกับ ZODB คุณสามารถใช้ที่จะเปลี่ยนวัตถุเช่นในตัวอย่างนี้
ในรุ่นนี้โดยเฉพาะการดำเนินงาน 1 หนีคำตอบ (พูดสำคัญเพราะพวกเขาสามารถป้อนด้วยคน!) รุ่นที่ 2 หนีคำถาม (พูดความสำคัญน้อยกว่าเพราะเหล่านี้สามารถป้อนโดยอนุญาต Personell เท่านั้น)
ในความเป็นจริงคุณไม่ได้จริงๆต้องดำเนินการเองของ ISchemaManager หนึ่งสามารถใช้ได้เราได้ใช้มันสำหรับหุ่นก่อนหน้านี้ มันใช้โมดูลหลามสำหรับองค์กรของฟังก์ชั่น evolver ดู docstring สำหรับข้อมูลเพิ่มเติม
ในชีวิตจริงคุณจะมีความซับซ้อนมากขึ้นโครงสร้างวัตถุมากกว่าหนึ่งที่นี่ ที่จะทำให้ชีวิตของคุณง่ายขึ้นมีสองฟังก์ชั่นที่มีประโยชน์มากที่มีอยู่ใน zope.generations.utility: findObjectsMatching () และ findObjectsProviding () พวกเขาจะขุดผ่านภาชนะซ้ำที่จะช่วยให้คุณหาวัตถุเก่าที่คุณต้องการที่จะปรับปรุงโดยอินเตอร์เฟซหรือเกณฑ์อื่น ๆ พวกเขาจะง่ายต่อการเข้าใจของพวกเขาตรวจสอบ docstrings
รุ่นในการดำเนินการ
ดังนั้นลูกค้าของเราโกรธดาวน์โหลดรหัสใหม่ล่าสุดของเราและเริ่มต้นใหม่ Zope เหตุการณ์ที่ถูกส่งโดยอัตโนมัติอีกครั้ง
& nbsp; >>> เหตุการณ์ = DatabaseOpenedEventStub (DB)
& nbsp; >>> evolveMinimumSubscriber (event) การ
แซม! ลูกค้ามีความสุขอีกครั้ง!
& nbsp; >>> pprint (ราก ['คำตอบ'])
& nbsp; {'สวัสดี': 'สวัสดีและคุณจะทำอย่างไร?'
& nbsp; 'ความหมายของชีวิต?': '42',
& nbsp; 'สี่ เพราะ evolveMinimumSubscriber ขี้เกียจมากก็เพียงการปรับปรุงฐานข้อมูลพอเพียงเพื่อให้โปรแกรมประยุกต์ของคุณสามารถใช้มัน (เพื่อ minimum_generation ที่มี) อันที่จริงเครื่องหมายแสดงให้เห็นว่าการสร้างฐานข้อมูลที่ได้รับการกระแทกถึง 1:
& nbsp; >>> ราก [generations_key] ['some.app']
& nbsp; 1
เราจะเห็นว่าคนรุ่นกำลังทำงานดังนั้นเราจึงตัดสินใจที่จะใช้ขั้นตอนต่อไปและพัฒนาสู่รุ่น 2. ลองมาดูวิธีนี้สามารถทำได้ด้วยตนเอง:
& nbsp; >>> นำเข้าจาก zope.generations.generations วิวัฒนาการ
& nbsp; >>> วิวัฒนาการ (DB)
& nbsp; >>> pprint (ราก ['คำตอบ'])
& nbsp; {'สวัสดี': 'สวัสดีและคุณจะทำอย่างไร?'
& nbsp; 'ความหมายของชีวิต?': '42',
& nbsp; 'สี่ & nbsp; >>> ราก [generations_key] ['some.app']
& nbsp; 2
การทำงานเริ่มต้นของการอัพเกรดวิวัฒนาการเพื่อรุ่นล่าสุดให้โดย SchemaManager คุณสามารถใช้อาร์กิวเมนต์วิธีที่จะพัฒนา () เมื่อคุณต้องการเพียงแค่การตรวจสอบว่าคุณจำเป็นต้องปรับปรุงหรือถ้าคุณต้องการที่จะขี้เกียจเหมือนสมาชิกที่เราได้เรียกว่าก่อนหน้านี้
การสั่งซื้อของผู้จัดการสคี
ระบบย่อยที่ใช้บ่อยในการเขียนโปรแกรมที่พึ่งพาระบบย่อยอื่น ๆ ที่จะดำเนินการอย่างถูกต้อง หากระบบย่อยทั้งให้ผู้จัดการคีมาก็มักจะเป็นประโยชน์ที่จะรู้ว่าลำดับที่ evolvers จะถูกเรียก นี้จะช่วยให้กรอบและเป็นลูกค้าที่จะสามารถที่จะพัฒนาในคอนเสิร์ตและลูกค้าสามารถรู้ได้ว่ากรอบการทำงานจะได้รับการพัฒนาก่อนหรือหลังตัวเอง
นี้สามารถทำได้โดยการควบคุมชื่อของสาธารณูปโภคผู้จัดการสคี ผู้จัดการคีมาจะถูกเรียกใช้ในการสั่งซื้อที่กำหนดโดยการเรียงลำดับชื่อของพวกเขา
& nbsp; >>> Manager1 = SchemaManager (minimum_generation = 0, รุ่น = 0)
& nbsp; >>> manager2 = SchemaManager (minimum_generation = 0, รุ่น = 0)
& nbsp; >>> zope.component.provideUtility (
& nbsp; ... Manager1, ISchemaManager ชื่อ = 'another.app')
& nbsp; >>> zope.component.provideUtility (
& nbsp; ... manager2, ISchemaManager ชื่อ = 'another.app ขยาย')
ขอให้สังเกตว่าชื่อของแพคเกจแรกที่ถูกนำมาใช้เพื่อสร้าง namespace สำหรับแพคเกจขึ้น นี้ไม่ได้เป็นความต้องการของกรอบ แต่เป็นรูปแบบที่สะดวกสำหรับการใช้งานนี้
ลองวิวัฒนาการฐานข้อมูลที่จะสร้างคนรุ่นเหล่านี้:
& nbsp; >>> เหตุการณ์ = DatabaseOpenedEventStub (DB)
& nbsp; >>> evolveMinimumSubscriber (event) การ
& nbsp; >>> ราก [generations_key] ['another.app']
& nbsp; 0
& nbsp; >>> ราก [generations_key] ['another.app ขยาย']
& nbsp; 0
สมมติว่าด้วยเหตุผลบางอย่างของแต่ละระบบย่อยเหล่านี้ต้องการที่จะเพิ่มรุ่นและรุ่นที่ 1 ของ 'another.app ขยาย' ขึ้นอยู่กับรุ่นที่ 1 ของ 'another.app' เราจะต้องให้ผู้จัดการคีมาสำหรับแต่ละบันทึกที่ว่าพวกเขาได้รับการทำงานเพื่อให้เราสามารถตรวจสอบผล:
& nbsp; >>> gsm.unregisterUtility (ให้ = ISchemaManager ชื่อ = 'another.app')
& nbsp; ที่แท้จริง
& nbsp; >>> gsm.unregisterUtility (
& nbsp; ... ให้ = ISchemaManager ชื่อ = 'another.app ขยาย')
& nbsp; ที่แท้จริง
& nbsp; >>> ชั้น FoundationSchemaManager (วัตถุ):
& nbsp; ... การดำเนินการ (ISchemaManager)
& nbsp; ...
& nbsp; ... minimum_generation = 1
& nbsp; ... รุ่น = 1
& nbsp; ...
& nbsp; ... def วิวัฒนาการ (ตัวเองบริบทรุ่น):
& nbsp; ... ราก = context.connection.root ()
& nbsp; ... สั่งซื้อ = root.get ('สั่งซื้อ' [])
& nbsp; ... ถ้ารุ​​่น == 1:
& nbsp; ... ordering.append ('รากฐาน 1')
& nbsp; ... พิมพ์ 'Generation Foundation 1'
& nbsp; ... อื่น:
& nbsp; ... ยก ValueError ("น้องสอง")
& nbsp; ... ราก ['สั่งซื้อ'] = การสั่งซื้อ # ping ติดตา
& nbsp; ... transaction.commit ()
& nbsp; >>> ชั้น DependentSchemaManager (วัตถุ):
& nbsp; ... การดำเนินการ (ISchemaManager)
& nbsp; ...
& nbsp; ... minimum_generation = 1
& nbsp; ... รุ่น = 1
& nbsp; ...
& nbsp; ... def วิวัฒนาการ (ตัวเองบริบทรุ่น):
& nbsp; ... ราก = context.connection.root ()
& nbsp; ... สั่งซื้อ = root.get ('สั่งซื้อ' [])
& nbsp; ... ถ้ารุ​​่น == 1:
& nbsp; ... ordering.append ('ขึ้นอยู่กับ 1')
& nbsp; ... พิมพ์ 'รุ่นขึ้นอยู่กับ 1'
& nbsp; ... อื่น:
& nbsp; ... ยก ValueError ("น้องสอง")
& nbsp; ... ราก ['สั่งซื้อ'] = การสั่งซื้อ # ping ติดตา
& nbsp; ... transaction.commit ()
& nbsp; >>> Manager1 = FoundationSchemaManager ()
& nbsp; >>> manager2 = DependentSchemaManager ()
& nbsp; >>> zope.component.provideUtility (
& nbsp; ... Manager1, ISchemaManager ชื่อ = 'another.app')
& nbsp; >>> zope.component.provideUtility (
& nbsp; ... manager2, ISchemaManager ชื่อ = 'another.app ขยาย')
การพัฒนาฐานข้อมูลในขณะนี้มักจะเรียกใช้ 'another.app' evolver ก่อน 'another.app ขยาย' evolver:
& nbsp; >>> เหตุการณ์ = DatabaseOpenedEventStub (DB)
& nbsp; >>> evolveMinimumSubscriber (event) การ
& nbsp; รุ่นรากฐาน 1
& nbsp; รุ่นขึ้นอยู่กับ 1
& nbsp; >>> ราก ['สั่งซื้อ']
& nbsp; ['รากฐาน 1', 'ขึ้นอยู่กับ 1']
การติดตั้ง
ในตัวอย่างข้างต้นเราเริ่มต้นได้ด้วยตนเองคำตอบ เราไม่ควรจะต้องทำด้วยตนเอง การประยุกต์ใช้ควรจะสามารถที่จะทำเช่นนั้นโดยอัตโนมัติ
IInstallableSchemaManager ขยาย ISchemaManager ให้วิธีการติดตั้งสำหรับการดำเนินการติดตั้ง intial ของโปรแกรม นี้เป็นทางเลือกที่ดีกว่าการลงทะเบียนผู้ใช้บริการฐานข้อมูลเปิด
ให้มีกำหนดผู้จัดการ Schema ใหม่ที่มีการติดตั้ง:
& nbsp; >>> gsm.unregisterUtility (ให้ = ISchemaManager ชื่อ = 'some.app')
& nbsp; ที่แท้จริง
& nbsp; >>> นำเข้าจาก zope.generations.interfaces IInstallableSchemaManager
& nbsp; >>> ชั้น MySchemaManager (วัตถุ):
& nbsp; ... การดำเนินการ (IInstallableSchemaManager)
& nbsp; ...
& nbsp; ... minimum_generation = 1
& nbsp; ... รุ่น = 2
& nbsp; ...
& nbsp; ... def ติดตั้ง (ตัวเองบริบท):
& nbsp; ... ราก = context.connection.root ()
& nbsp; ... ราก ['คำตอบ'] = {'สวัสดี': '? Hi และคุณจะทำอย่างไร'
& nbsp; ... 'ความหมายของชีวิต': '42',
& nbsp; ... สี่ & nbsp; ... transaction.commit ()
& nbsp; ...
& nbsp; ... def วิวัฒนาการ (ตัวเองบริบทรุ่น):
& nbsp; ... ราก = context.connection.root ()
& nbsp; ... คำตอบ = ราก ['คำตอบ']
& nbsp; ... ถ้ารุ​​่น == 1:
& nbsp; ... สำหรับคำถามคำตอบใน answers.items ():
& nbsp; ... คำตอบ [คำถาม] = cgi.escape (คำตอบ)
& nbsp; ... รุ่น elif == ที่ 2:
& nbsp; ... สำหรับคำถามคำตอบใน answers.items ():
& nbsp; ... คำตอบที่เดล [คำถาม]
& nbsp; ... คำตอบ [cgi.escape (คำถาม)] = คำตอบ
& nbsp; ... อื่น:
& nbsp; ... ยก ValueError ("น้องสอง")
& nbsp; ... ราก ['คำตอบ'] = ตอบ # ping ติดตา
& nbsp; ... transaction.commit ()
& nbsp; >>> ผู้จัดการ = MySchemaManager ()
& nbsp; >>> zope.component.provideUtility (ผู้จัดการ ISchemaManager ชื่อ = 'some.app')
ตอนนี้ให้เปิดฐานข้อมูลใหม่
& nbsp; >>> db.close ()
& nbsp; >>> dB = DB ()
& nbsp; >>> conn = db.open ()
& nbsp; >>> 'คำตอบ' ใน conn.root ()
& nbsp; เท็จ
& nbsp; >>> เหตุการณ์ = DatabaseOpenedEventStub (DB)
& nbsp; >>> evolveMinimumSubscriber (event) การ
& nbsp; >>> conn.sync ()
& nbsp; >>> ราก = conn.root ()
& nbsp; >>> pprint (ราก ['คำตอบ'])
& nbsp; {'สวัสดี': 'สวัสดีและคุณจะทำอย่างไร?'
& nbsp; 'ความหมายของชีวิต?': '42',
& nbsp; 'สี่ & nbsp; >>> ราก [generations_key] ['some.app']
& nbsp; 2
ล็อกธุรกรรม ZODB ตั้งข้อสังเกตว่าการติดตั้งสคริปต์ของเรากำลังดำเนินการ
& nbsp; >>> [. it.description สำหรับมันใน conn.db () storage.iterator ()] [- 2]
& nbsp; u'some.app: ทำงานติดตั้งรุ่น '
(ไมเนอร์บันทึก: มันไม่ใช่ระเบียนสุดท้ายเพราะมีสองกระทำ: MySchemaManager ดำเนินการอย่างใดอย่างหนึ่งและ evolveMinimumSubscriber ดำเนินการอย่างใดอย่างหนึ่งที่สอง MySchemaManager ไม่ได้จริงๆต้องกระทำ..)

มีอะไรใหม่ ในข่าวประชาสัมพันธ์ฉบับนี้.

  • เพิ่มการสนับสนุนสำหรับ Python 3.3
  • แทนที่เลิกใช้ zope.interface.implements กับมัณฑนากร zope.interface.implementer เทียบเท่า.
  • ลดการสนับสนุนสำหรับ Python 2.4 และ 2.5.

มีอะไรใหม่ ในรุ่น 3.7.1:

  • ส่ว​​น buildout เอาออกซึ่งถูกนำมาใช้ในระหว่างการพัฒนา แต่ไม่ ไม่รวบรวมบน Windows.
  • สคริปต์รุ่นเพิ่มบันทึกการทำธุรกรรม.

ต้องการ

  • หลาม

ซอฟแวร์อื่น ๆ ของนักพัฒนา Zope Corporation and Contributors

zope.app.container
zope.app.container

14 Apr 15

zope.fanstatic
zope.fanstatic

11 May 15

zope.tales
zope.tales

14 Apr 15

Products.ZNagios
Products.ZNagios

11 May 15

ความคิดเห็นที่ zope.generations

ความคิดเห็นที่ไม่พบ
เพิ่มความคิดเห็น
เปิดภาพ!