zope.generations

Software screenshot:
zope.generations
Software ətraflı:
Version: 4.0.0 Alpha 1
Tarixi Upload: 15 Apr 15
Lisenziya: Pulsuz
Məşhurluq: 2

Rating: nan/5 (Total Votes: 0)

zope.generations bazası obyektlərin yenilənməsi bir yol təqdim edir zaman tətbiq şeması dəyişikliklər & nbsp;. Ərizə şeması mahiyyətcə data strukturu, ZODB halda və ya halda masa təsviri dərsləri strukturu bir relational verilənlər bazası.
Ətraflı Documentation
Generations bazası proqram şeması dəyişikliklər obyektlərin yenilənməsi bir yoldur. Ərizə şeması mahiyyətcə data strukturu, ZODB və ya bir relational verilənlər bazası halda masa təsviri halda dərsləri strukturu.
Siz proqram data strukturları dəyişdirmək zaman, məsələn, bir sinif bir mövcud sahəsində semantik mənası dəyişir, sizin dəyişiklik əvvəl yaradılmışdır məlumat bazaları ilə bir problem var. Daha ətraflı müzakirə və mümkün həlləri üçün, http://wiki.zope.org/zope3/DatabaseGenerations bax
Biz komponent memarlıq istifadə olunacaq və biz bir verilənlər bazası və bağlantısı lazımdır:
& Nbsp; >>> idxal cgi
& Nbsp; >>> pprint idxal pprint dən
& Nbsp; >>> zope.interface idxal həyata keçirir dən
& Nbsp; >>> olan ZODB.tests.util idxal DB
& Nbsp; >>> db = DB ()
& Nbsp; >>> Pak = db.open ()
& Nbsp; >>> kök = conn.root ()
Bizim proqram bir oracle ki, Təsəvvür edin: Siz ifadələr reaksiya üçün öyrətmək olar. Sadə saxlamaq və dict veri edək:
& Nbsp; >>> kök ['cavab'] = {'Salam': 'Salam və siz bunu necə,
& Nbsp; ...? Həyatın mənası: '42',
& Nbsp; ... "dörd & Nbsp; >>> idxal əməliyyat
& Nbsp; >>> transaction.commit ()
İlkin quraşdırma
Burada bəzi nəsillər xüsusi kodu var. Biz yaratmaq və SchemaManager qeydiyyatdan edəcək. SchemaManagers bazası faktiki yenilikləri üçün məsuliyyət daşıyırlar. Bu yalnız bir dummy olacaq. Burada point nəsillər bizim proqram nəsillər dəstəkləyir ki, xəbərdar modul etməkdir.
Bu nəsillər idarə etmək üçün Python modulları istifadə edir, çünki SchemaManager default həyata keçirilməsi bu test üçün uyğun deyil. Biz yalnız hələ heç bir şey istəmirəm-ci ildən İndi, bu, yalnız gözəl olacaq.
& Nbsp; >>> zope.generations.interfaces ISchemaManager idxal olan
& Nbsp; >>> zope.generations.generations SchemaManager idxal olan
& Nbsp; >>> idxal zope.component
& Nbsp; >>> dummy_manager = SchemaManager (minimum_generation = 0, nəsil = 0)
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... dummy_manager, ISchemaManager, name = 'some.app)
"Some.app" benzersiz bir tanıdan edir. Siz URI və ya paketinin dotted adı istifadə etməlidir.
Siz Zope başlamaq və verilənlər bazası açılır zaman, bir hadisə IDatabaseOpenedWithRoot göndərilir. Zope bu hadisə üçün bir handler kimi ismarıcları evolveMinimumSubscriber qeydə. Bu biclik edək:
& Nbsp; >>> sinif DatabaseOpenedEventStub (obyektin):
& Nbsp; ... def __init __ (self, verilənlər bazası):
& Nbsp; ... self.database = bazası
& Nbsp; >>> hadisə = DatabaseOpenedEventStub (db)
& Nbsp; >>> zope.generations.generations evolveMinimumSubscriber idxal olan
& Nbsp; >>> evolveMinimumSubscriber (hadisə)
bu hərəkətin nəticəsi indi verilənlər bazası mövcud şeması sayı biz şeması yeniləmə zaman, Zope3 başlanğıc nöqtəsi oldu nə bir fikir olacaq 0 olması ehtiva edir. Burada görmək?
& Nbsp; >>> zope.generations.generations generations_key idxal olan
& Nbsp; >>> root [generations_key] ['some.app']
& Nbsp; 0
Real həyatda siz birbaşa bu əsas ilə narahat heç vaxt lazımdır, lakin bu var ki, xəbərdar olmalıdır.
Upgrade ssenari
Geri hekayə. Bir müddət keçir və biz HTML xüsusi simvol qaçmağa unuttum çünki bizim müştərilərin bir hücumu olur! dəhşət! Biz hər hansı bir məlumat itirmədən ASAP bu problemi həll etməlidir. Biz həmyaşıdları impress üçün nəsillər istifadə karar.
Üzrə şeması meneceri yeniləmə (köhnə bir açılan və yeni xüsusi bir yüklemek) edək:
& Nbsp; >>> zope.component idxal globalregistry dən
& Nbsp; >>> gsm = globalregistry.getGlobalSiteManager ()
& Nbsp; >>> gsm.unregisterUtility (təmin = ISchemaManager, name = 'some.app)
& Nbsp; True
& Nbsp; >>> sinif MySchemaManager (obyektin):
& Nbsp; ... həyata keçirir (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... nəsil = 2
& Nbsp; ...
& Nbsp; ... def (özünü, kontekstində, nəsil) inkişaf:
& Nbsp; ... kök = context.connection.root ()
& Nbsp; ... cavablar = root ['cavab']
& Nbsp; ... əgər nəsil == 1:
& Nbsp; ... sualına, answers.items cavab ():
& Nbsp; ... cavablar [sual] = cgi.escape (cavab)
& Nbsp; ... elif nəsil == 2:
& Nbsp; ... sualına, answers.items cavab ():
& Nbsp; ... del cavab [sual]
& Nbsp; ... cavab [cgi.escape (sual)] = cavab
& Nbsp; ... başqa:
& Nbsp; ... ("bummer") ValueError qaldırmaq
& Nbsp; ... kök ['cavab'] cavablar # ping əzmkarlıq =
& Nbsp; ... transaction.commit ()
& Nbsp; >>> meneceri = MySchemaManager ()
& Nbsp; >>> zope.component.provideUtility (meneceri ISchemaManager, name = 'some.app)
Biz tətbiqi bu SchemaManager bilir son nəsil təxminən 2 o deməkdir ki, nəsil atributu 2 üçün müəyyən edilir nəsil 1. daha yaşlı bir verilənlər bazası ilə run imtina edəcək o deməkdir ki, 1. minimum_generation qoymuşuq.
() inkişaf beygir burada. Onun iş nəsil-1 nəsil bazası əldə etməkdir. Bu ZODB bir bağlantısı atributu 'əlaqə', bir kontekstində olur. Bu nümunə kimi obyektlərin dəyişdirmək üçün istifadə edə bilərsiniz.
(Onlar hər kəs tərəfindən daxil ola bilər, çünki, tənqidi demək!) Bu icra nəsil 1 cavab escape nəsil 2 sual escape (az əhəmiyyətli demək, bu səlahiyyətli personellerimiz yalnız daxil ola bilər, çünki).
Əslində, həqiqətən ISchemaManager xüsusi həyata keçirilməsi ehtiyac yoxdur. Bir daha əvvəl bir dummy üçün istifadə, mövcuddur. Bu evolver funksiyaları təşkili üçün Python modulları istifadə edir. Daha çox məlumat üçün docstring baxın.
Real həyatda burada bir çox daha mürəkkəb obyekt strukturları var. FindObjectsMatching () və findObjectsProviding (): sizin həyat daha asan etmək üçün, zope.generations.utility mövcud iki çox faydalı funksiyaları var. Onlar sizə interfeysi ilə və ya digər meyarlar, yeniləmə istəyən köhnə obyektlərin axtarmaq kömək etmək üçün recursively konteyner vasitəsilə qazmaq edəcək. Onlar docstrings yoxlamaq, anlamaq asandır.
Fəaliyyət Generations
Belə ki, qəzəbli müştəri Son kodu downloads və Zope yeniden. Tədbir avtomatik olaraq yenidən göndərilir:
& Nbsp; >>> hadisə = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (hadisə)
Shazam! Müştəri daha xoşbəxt edir!
& Nbsp; >>> pprint (root ['cavab'])
& Nbsp; {'Salam': 'Salam və siz nə edirsiniz? "
& Nbsp; həyat mənası? ": '42',
& Nbsp; 'dörd EvolveMinimumSubscriber çox tənbəl, çünki proqram istifadə edə bilərsiniz, belə ki, o, yalnız kifayət qədər məlumat bazası yenilikləri (minimum_generation üçün, ki,). Həqiqətən, marker bazası nəsil 1 bumped edilmişdir ki, göstərir:
& Nbsp; >>> root [generations_key] ['some.app']
& Nbsp; 1
Biz nəsillər çalışırıq ki, görəcəksiniz, belə ki, biz bu əl edilə bilər necə edək növbəti addım və nəsil 2. inkişaf qərar:
& Nbsp; >>> zope.generations.generations inkişaf idxal olan
& Nbsp; >>> (db) inkişaf
& Nbsp; >>> pprint (root ['cavab'])
& Nbsp; {'Salam': 'Salam və siz nə edirsiniz? "
& Nbsp; həyat mənası? ": '42',
& Nbsp; 'dörd & Nbsp; >>> root [generations_key] ['some.app']
& Nbsp; 2
SchemaManager tərəfindən verilən son nəsil Bu inkişaf yükseltmeleri Default davranış. Siz güncellemeniz lazımdır və ya biz əvvəl çağırıb abunəçi kimi tənbəl olmaq istəyirsinizsə yalnız check istədiyiniz zaman) (inkişaf necə dəlil istifadə edə bilərsiniz.
şeması idarəçiləri Qayda
Tez-tez düzgün fəaliyyət üçün digər alt etibar ərizə yaratmaq üçün istifadə alt. Hər iki alt şeması menecerləri təmin varsa, bu Evolvers istinad olunacaq sifariş bilmək üçün tez-tez faydalıdır. Bu çərçivə verir və müştərilər konsert inkişaf etmək üçün var, və müştərilərin çərçivə əvvəl və ya özü sonra inkişaf edəcək ki, bilirik.
Bu şeması meneceri kommunal adları nəzarət həyata bilər. şeması menecerləri onların adları çeşidlənməsi ilə müəyyən edilmiş qaydada idarə olunur.
& Nbsp; >>> manager1 = SchemaManager (minimum_generation = 0, nəsil = 0)
& Nbsp; >>> manager2 = SchemaManager (minimum_generation = 0, nəsil = 0)
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... manager1, ISchemaManager, name = 'another.app)
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... manager2, ISchemaManager, name = 'another.app-uzadılması)
İlk paketi adı asılı paketləri üçün bir ad yaratmaq üçün istifadə olunur necə edək. Bu çərçivəsində bir tələb, lakin bu istifadə üçün rahat model deyil.
Nin bu nəsillər yaratmaq üçün verilənlər bazası inkişaf edək:
& Nbsp; >>> hadisə = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (hadisə)
& Nbsp; >>> root [generations_key] ['another.app']
& Nbsp; 0
& Nbsp; >>> root [generations_key] ['another.app-uzadılması']
& Nbsp; 0
Üzrə nədənsə bu alt hər bir nəsil əlavə etmək lazımdır, və another.app-uzadılması 'ki, nəsil 1' another.app 'nəsil 1 asılıdır ki, fərz edək. Biz belə ki, biz nəticə kontrol edə bilərsiniz run olduğunuz hər rekord üçün şeması menecerləri təmin etmək lazımdır:
& Nbsp; >>> gsm.unregisterUtility (təmin = ISchemaManager, name = 'another.app)
& Nbsp; True
& Nbsp; >>> gsm.unregisterUtility (
& Nbsp; ... təmin = ISchemaManager, name = 'another.app-uzadılması)
& Nbsp; True
& Nbsp; >>> sinif FoundationSchemaManager (obyektin):
& Nbsp; ... həyata keçirir (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... nəsil = 1
& Nbsp; ...
& Nbsp; ... def (özünü, kontekstində, nəsil) inkişaf:
& Nbsp; ... kök = context.connection.root ()
& Nbsp; ... sifariş = root.get (sifariş "[])
& Nbsp; ... əgər nəsil == 1:
& Nbsp; ... ordering.append ("təməl 1)
& Nbsp; ... print 'təməl nəsil 1'
& Nbsp; ... başqa:
& Nbsp; ... ("bummer") ValueError qaldırmaq
& Nbsp; ... kök ['sifariş'] = sifariş # ping əzmkarlıq
& Nbsp; ... transaction.commit ()
& Nbsp; >>> sinif DependentSchemaManager (obyektin):
& Nbsp; ... həyata keçirir (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... nəsil = 1
& Nbsp; ...
& Nbsp; ... def (özünü, kontekstində, nəsil) inkişaf:
& Nbsp; ... kök = context.connection.root ()
& Nbsp; ... sifariş = root.get (sifariş "[])
& Nbsp; ... əgər nəsil == 1:
& Nbsp; ... ordering.append ("asılı 1)
& Nbsp; ... print "asılı nəsil 1 '
& Nbsp; ... başqa:
& Nbsp; ... ("bummer") ValueError qaldırmaq
& Nbsp; ... kök ['sifariş'] = sifariş # ping əzmkarlıq
& Nbsp; ... transaction.commit ()
& Nbsp; >>> manager1 = FoundationSchemaManager ()
& Nbsp; >>> manager2 = DependentSchemaManager ()
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... manager1, ISchemaManager, name = 'another.app)
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... manager2, ISchemaManager, name = 'another.app-uzadılması)
Həmişə evolver evolver "another.app-uzadılması" əvvəl "another.app" davam edəcək İndi bazası inkişaf:
& Nbsp; >>> hadisə = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (hadisə)
& Nbsp; təməl nəsil 1
& Nbsp; asılı nəsil 1
& Nbsp; >>> kök ['sifariş']
& Nbsp; ['təməl 1', 'asılı 1']
Quraşdırma
Yuxarıdakı misalda, biz əl cavab başlatılmış. Biz özünüz etmək lazım deyil. Bu proqram avtomatik olaraq bunu etmək lazımdır.
IInstallableSchemaManager bir proqram bir intial quraşdırılması həyata keçirilməsi üçün quraşdırma metodu təmin ISchemaManager uzanır. Bu verilənlər bazası açıldı abonentləri qeydiyyatdan daha yaxşı alternativ deyil.
Üzrə quraşdırma olan yeni şeması meneceri müəyyən edək:
& Nbsp; >>> gsm.unregisterUtility (təmin = ISchemaManager, name = 'some.app)
& Nbsp; True
& Nbsp; >>> zope.generations.interfaces IInstallableSchemaManager idxal olan
& Nbsp; >>> sinif MySchemaManager (obyektin):
& Nbsp; ... həyata keçirir (IInstallableSchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... nəsil = 2
& Nbsp; ...
& Nbsp; ... def yüklemek (self kontekstində):
& Nbsp; ... kök = context.connection.root ()
& Nbsp; ... kök ['cavab'] = {'Salam': 'Salam və siz bunu necə,
& Nbsp; ...? Həyatın mənası: '42',
& Nbsp; ... "dörd & Nbsp; ... transaction.commit ()
& Nbsp; ...
& Nbsp; ... def (özünü, kontekstində, nəsil) inkişaf:
& Nbsp; ... kök = context.connection.root ()
& Nbsp; ... cavablar = root ['cavab']
& Nbsp; ... əgər nəsil == 1:
& Nbsp; ... sualına, answers.items cavab ():
& Nbsp; ... cavablar [sual] = cgi.escape (cavab)
& Nbsp; ... elif nəsil == 2:
& Nbsp; ... sualına, answers.items cavab ():
& Nbsp; ... del cavab [sual]
& Nbsp; ... cavab [cgi.escape (sual)] = cavab
& Nbsp; ... başqa:
& Nbsp; ... ("bummer") ValueError qaldırmaq
& Nbsp; ... kök ['cavab'] cavablar # ping əzmkarlıq =
& Nbsp; ... transaction.commit ()
& Nbsp; >>> meneceri = MySchemaManager ()
& Nbsp; >>> zope.component.provideUtility (meneceri ISchemaManager, name = 'some.app)
İndi isə yeni bir verilənlər bazası açmaq imkanı verir:
& Nbsp; >>> db.close ()
& Nbsp; >>> db = DB ()
& Nbsp; >>> Pak = db.open ()
& Nbsp; conn.root da >>> cavab ()
& Nbsp; False
& Nbsp; >>> hadisə = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (hadisə)
& Nbsp; >>> conn.sync ()
& Nbsp; >>> kök = conn.root ()
& Nbsp; >>> pprint (root ['cavab'])
& Nbsp; {'Salam': 'Salam və siz nə edirsiniz? "
& Nbsp; həyat mənası? ": '42',
& Nbsp; 'dörd & Nbsp; >>> root [generations_key] ['some.app']
& Nbsp; 2
ZODB əməliyyat log bizim quraşdırma script icra edilmişdir ki, qeyd
& Nbsp; >>> [. Conn.db bunun üçün it.description () storage.iterator ()] [- 2]
& Nbsp; u'some.app: "nəsil quraşdırma çalışan

Nə yeni <(Kiçik Qeyd: MySchemaManager bir həyata keçirir və evolveMinimumSubscriber ikinci həyata MySchemaManager həqiqətən törətmək lazım deyil: iki öhdəliyini var, çünki son rekord deyil.). Bu azad> / strong.

  • Python 3.3 üçün əlavə dəstək

  • Ekvivalent zope.interface.implementer decorator ilə
  • Dəyişdirilən deprecated zope.interface.implements istifadə.
  • Python 2.4 və 2.5 dəstək düşdü.

versiya 3.7.1 yeni nədir:

    inkişaf zamanı istifadə, lakin nə oldu
  • silindi buildout hissəsi Windows tərtib deyil.
  • Generation scripts əməliyyat qeyd əlavə edin.

tələblər

  • Python

Geliştirici digər proqram Zope Corporation and Contributors

Şərh zope.generations

Şərhlər tapılmadı
Şərh əlavə
Images yandırın!