zope.generations

Szoftver screenshot:
zope.generations
Szoftver adatai:
Változat: 4.0.0 Alpha 1
Feltöltés dátuma: 15 Apr 15
Engedély: Ingyenes
Népszerűség: 2

Rating: nan/5 (Total Votes: 0)

zope.generations egyik módja frissítésének az objektumok az adatbázisban, amikor az alkalmazás séma változások. & Nbsp; Egy alkalmazás séma lényegében az adatok szerkezetét, a szerkezet a osztályok esetében a ZODB vagy a táblázat leírások abban az esetben, egy relációs adatbázis.
részletes dokumentációt
Generációk egy frissíteni, ezáltal az objektumok az adatbázisban, ha az alkalmazás sémamódosítások. Egy alkalmazás séma lényegében az adatok szerkezetét, a szerkezet a osztályok esetében a ZODB vagy a táblázat leírások abban az esetben, egy relációs adatbázisban.
Ha megváltoztatja az alkalmazás adatait struktúrák, például megváltoztatja a szemantikai jelentése egy létező mező egy osztályban, akkor van egy probléma, adatbázisok előtt jöttek létre a változást. Az alaposabb vitát és a lehetséges megoldásokat, lásd http://wiki.zope.org/zope3/DatabaseGenerations
Mi lesz a komponens architektúra, és mi szükség van az adatbázis és a kapcsolat:
& Nbsp; >>> import cgi
& Nbsp; >>> from pprint import pprint
& Nbsp; >>> from zope.interface import munkagépek
& Nbsp; >>> from ZODB.tests.util import DB
& Nbsp; >>> db = DB ()
& Nbsp; >>> kapcs = db.open ()
& Nbsp; >>> root = conn.root ()
Képzeld el, hogy mi az alkalmazás egy oracle: meg lehet tanítani, hogy reagáljon mondatok. Nézzük, hogy ez egyszerű és tárolja az adatokat egy dict:
& Nbsp; >>> gyökér ['választ'] = {"Helló": "Hi-hogyan csinálod?",
& Nbsp; ... "az élet értelme?": "42",
& Nbsp; ... "Négy & Nbsp; >>> importügyletnél
& Nbsp; >>> transaction.commit ()
Gyári beállítások
Itt van néhány generáción-specifikus kód. Fogunk létrehozni és regisztrálni a SchemaManager. SchemaManagers felelősek a tényleges frissítéseket az adatbázis. Ez az egy lesz csak egy bábu. A lényeg itt az, hogy a generációk modul tudja, hogy mi az alkalmazás támogatja generációk.
Az alapértelmezett végrehajtása SchemaManager nem alkalmas ez a teszt, mert használ Python modulok kezelésére generációk. Egyelőre úgy rendben lesz, mert nem akarom, hogy bármit csak még.
& Nbsp; >>> from zope.generations.interfaces importálni ISchemaManager
& Nbsp; >>> from zope.generations.generations importálni SchemaManager
& Nbsp; >>> import zope.component
& Nbsp; >>> dummy_manager = SchemaManager (minimum_generation = 0, generációs = 0)
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... dummy_manager, ISchemaManager, name = 'some.app)
"Some.app" egy egyedi azonosítót. Akkor érdemes használni egy URI, vagy a kipontozott nevét csomagot.
Amikor elkezd Zope és adatbázis megnyitásakor, egy esemény IDatabaseOpenedWithRoot küld. Zope regisztrálja evolveMinimumSubscriber alapértelmezés szerint handler erre az eseményre. Nézzük ezt szimulálni:
& Nbsp; >>> class DatabaseOpenedEventStub (tárgy):
& Nbsp; ... def __init __ (self, adatbázis):
& Nbsp; ... self.database = adatbázisban
& Nbsp; >>> event = DatabaseOpenedEventStub (db)
& Nbsp; >>> from zope.generations.generations importálni evolveMinimumSubscriber
& Nbsp; >>> evolveMinimumSubscriber (esemény)
Ennek az a következménye akció, hogy most az adatbázis tartalmazza az a tény, hogy a jelenlegi séma száma 0. frissítésekor, amennyiben az a séma, Zope3 lesz egy ötlet, amit a kiindulási pont volt. Itt, látod?
& Nbsp; >>> from zope.generations.generations importálni generations_key
& Nbsp; >>> gyökér [generations_key] ['some.app']
& Nbsp; 0
A valós életben soha nem kell bajlódnia Ezzel a gombbal közvetlenül, de tudnia kell, hogy létezik.
Frissítés forgatókönyv
Vissza a történetet. Eltelik némi idő, és az egyik ügyfelünk meghackelésének mert elfelejtettem menekülni HTML speciális karaktereket! A horror! Meg kell megoldhatja a problémát ASAP adatvesztés nélkül. Mi úgy döntenek, hogy generációk lenyűgözni mi társaik.
Nézzük frissíti a sémakezelővel (vidd a régit, és helyezzen be egy új egyénit is):
& Nbsp; >>> from zope.component import globalregistry
& Nbsp; >>> gsm = globalregistry.getGlobalSiteManager ()
& Nbsp; >>> gsm.unregisterUtility (feltéve = ISchemaManager, name = 'some.app)
& Nbsp; True
& Nbsp; >>> class MySchemaManager (tárgy):
& Nbsp; ... munkagépek (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... generációs = 2
& Nbsp; ...
& Nbsp; ... def fejlődnek (self, összefüggésben generáció):
& Nbsp; ... root = context.connection.root ()
& Nbsp; ... választ = root ['válaszok "]
& Nbsp; ... ha generációs == 1:
& Nbsp; ... a kérdés, válasz a answers.items ():
& Nbsp; ... választ [kérdés] = cgi.escape (válasz)
& Nbsp; ... elif generációs == 2:
& Nbsp; ... a kérdés, válasz a answers.items ():
& Nbsp; ... del választ [kérdés]
& Nbsp; ... választ [cgi.escape (kérdés)] = válasz
& Nbsp; ... else:
& Nbsp; ... fel ValueError ("Betli")
& Nbsp; ... gyökere ['választ'] = válaszokat # ping perzisztencia
& Nbsp; ... transaction.commit ()
& Nbsp; >>> manager = MySchemaManager ()
& Nbsp; >>> zope.component.provideUtility (manager, ISchemaManager, name = 'some.app)
Hoztunk minimum_generation hogy 1. Ez azt jelenti, hogy a kérelmet fog lefutni egy adatbázis évesnél idősebb nemzedék 1. A generációs tulajdonság értéke 2, ami azt jelenti, hogy a legújabb generációs hogy ez SchemaManager tud 2.
fejlődnek () az igásló itt. Feladata az, hogy az adatbázis nemzedékről-nemzedékre 1. Egyre összefüggésben, amely az attribútum "kapcsolat", amely a kapcsolat a ZODB. Használhatja, hogy változtatni tárgyak, mint ebben a példában.
Ebben a konkrét végrehajtás generációs 1 menekül a választ (mondjuk, kritikus, mert lehet beírni senki!), 2. generációs menekül a kérdéseket (mondjuk, kevésbé fontos, mert ezek is beírhatja engedélyezett személyzettel esetén).
Sőt, akkor nem igazán kell egy egyéni végrehajtása ISchemaManager. Az egyik lehetőség, amit használtam egy dummy korábban. Ez használ Python modulok szervezésében Evolver funkciók. Lásd a docstring további információkért.
A valós életben lesz sokkal bonyolultabb objektum szerkezetek, mint az itt. Ahhoz, hogy az élet könnyebb, van két nagyon hasznos funkció áll rendelkezésre zope.generations.utility: findObjectsMatching () és findObjectsProviding (). Ők ásni a konténerek rekurzív, hogy segítsen keresik régi tárgyakat, hogy frissíteni szeretne, a felületet vagy valamilyen más kritériumokat. Ezek a könnyen érthető, ellenőrizze a docstrings.
generációk cselekvési
Szóval, mi dühös ügyfél letölti a legújabb kódot, és újraindítja Zope. Az esemény automatikusan elküldi újra:
& Nbsp; >>> event = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (esemény)
Shazam! A kliens újra boldog!
& Nbsp; >>> pprint (root ["választ"])
& Nbsp; {'Hello': 'Hi-hogyan csinálod? ",
& Nbsp; "az élet értelme?": "42",
& Nbsp; "négy Mivel evolveMinimumSubscriber nagyon lusta, csak frissíti az adatbázist épp csak annyira, hogy az alkalmazások tudják használni (a minimum_generation, vagyis). Valóban, a marker azt jelzi, hogy az adatbázis generációt ütközött a 1:
& Nbsp; >>> gyökér [generations_key] ['some.app']
& Nbsp; 1
Látjuk, hogy a generációk dolgoznak, ezért úgy dönt, hogy megteszi a következő lépést, és fejlődni nemzedékre 2. Lássuk, hogyan lehet ezt megtenni manuálisan:
& Nbsp; >>> from zope.generations.generations importálni fejlődni
& Nbsp; >>> fejlődnek (db)
& Nbsp; >>> pprint (root ["választ"])
& Nbsp; {'Hello': 'Hi-hogyan csinálod? ",
& Nbsp; "az élet értelme?": "42",
& Nbsp; "négy & Nbsp; >>> gyökér [generations_key] ['some.app']
& Nbsp; 2
Alapértelmezett viselkedése Evolve frissítés a legújabb generációs, amelyet a SchemaManager. Használhatja a how argumentum fejlődik (), ha azt szeretnénk, csak hogy ellenőrizze, ha kell frissíteni, vagy ha azt szeretné, hogy lusta, mint az előfizető, amely hívtuk korábban.
Rendelés séma vezetők
Gyakran alrendszerek összeállításához használt egy alkalmazás hivatkozhat más alrendszerek működik megfelelően. Ha mindkét alrendszerek biztosítják a sémát vezetők, gyakran hasznos tudni, hogy milyen sorrendben a evolvers nyújt segítséget. Ez lehetővé teszi, hogy a keret és az ügyfelei, hogy képes legyen fejlődni koncerten, és az ügyfelek tudják, hogy a keret kerül fejlődött előtt vagy után is.
Ez megvalósítható szabályozásával a nevét a séma menedzser segédprogramok. A séma vezetők futnak által meghatározott sorrendben válogatás a nevüket.
& Nbsp; >>> manager1 = SchemaManager (minimum_generation = 0, generációs = 0)
& Nbsp; >>> manager2 = SchemaManager (minimum_generation = 0, generációs = 0)
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... manager1, ISchemaManager, name = 'another.app)
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... manager2, ISchemaManager, name = 'another.app-kiterjesztés')
Figyeljük meg, hogy a neve az első csomag létrehozásához használt névtér a függő csomagok. Ez nem követelmény a keret, de kényelmes mintát ezt a viselkedést.
Nézzük fejlődnek az adatbázis létrehozásához a következő generációk:
& Nbsp; >>> event = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (esemény)
& Nbsp; >>> gyökér [generations_key] ['another.app']
& Nbsp; 0
& Nbsp; >>> gyökér [generations_key] ['another.app-kiterjesztés']
& Nbsp; 0
Tegyük fel, hogy valamilyen oknál fogva minden egyes alrendszerre kell hozzá egy generáció, és hogy generációs 1. "another.app-hosszabbító" függ generációs 1. "another.app". Mi kell adnia séma vezetők minden a rekordot, hogy már fut, így tudjuk ellenőrizni az eredmény:
& Nbsp; >>> gsm.unregisterUtility (feltéve = ISchemaManager, name = 'another.app)
& Nbsp; True
& Nbsp; >>> gsm.unregisterUtility (
& Nbsp; ... feltéve = ISchemaManager, name = 'another.app-kiterjesztés')
& Nbsp; True
& Nbsp; >>> class FoundationSchemaManager (tárgy):
& Nbsp; ... munkagépek (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... generációs = 1
& Nbsp; ...
& Nbsp; ... def fejlődnek (self, összefüggésben generáció):
& Nbsp; ... root = context.connection.root ()
& Nbsp; ... rendelési = root.get ("megrendelés", [])
& Nbsp; ... ha generációs == 1:
& Nbsp; ... ordering.append ("alapítvány 1)
& Nbsp; ... print "Alapítvány generációs 1"
& Nbsp; ... else:
& Nbsp; ... fel ValueError ("Betli")
& Nbsp; ... gyökere ['rendelési'] = rendelési # ping perzisztencia
& Nbsp; ... transaction.commit ()
& Nbsp; >>> class DependentSchemaManager (tárgy):
& Nbsp; ... munkagépek (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... generációs = 1
& Nbsp; ...
& Nbsp; ... def fejlődnek (self, összefüggésben generáció):
& Nbsp; ... root = context.connection.root ()
& Nbsp; ... rendelési = root.get ("megrendelés", [])
& Nbsp; ... ha generációs == 1:
& Nbsp; ... ordering.append ("eltartott 1)
& Nbsp; ... print "függő generációs 1"
& Nbsp; ... else:
& Nbsp; ... fel ValueError ("Betli")
& Nbsp; ... gyökere ['rendelési'] = rendelési # ping perzisztencia
& 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-kiterjesztés')
Fejlődik az adatbázis már mindig futni a "another.app" Evolver előtt "another.app-hosszabbító" Evolver:
& Nbsp; >>> event = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (esemény)
& Nbsp; alapítvány generációs 1
& Nbsp; függ generációs 1
& Nbsp; >>> gyökér ['rendelési']
& Nbsp; ['Alapítvány 1 "," függő 1 "]
Telepítés
A fenti példában, akkor kézzel inicializálja a választ. Nem kellene tennie, hogy a kézzel. Az alkalmazás lehetővé kell tenni, hogy ezt, hogy automatikusan.
IInstallableSchemaManager kiterjed ISchemaManager, amely egy telepítési módszer végző megrendelésekor kérhető telepítési kérelem. Ez egy jobb alternatíva, mint regisztráció adatbázis-nyitotta előfizetők.
Nézzünk meg egy új sémakezelővel, amely magában foglalja a telepítés:
& Nbsp; >>> gsm.unregisterUtility (feltéve = ISchemaManager, name = 'some.app)
& Nbsp; True
& Nbsp; >>> from zope.generations.interfaces importálni IInstallableSchemaManager
& Nbsp; >>> class MySchemaManager (tárgy):
& Nbsp; ... munkagépek (IInstallableSchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... generációs = 2
& Nbsp; ...
& Nbsp; ... def telepíteni (self, összefüggésben):
& Nbsp; ... root = context.connection.root ()
& Nbsp; ... gyökere ['választ'] = {"Helló": "Hi-hogyan csinálod?",
& Nbsp; ... "az élet értelme?": "42",
& Nbsp; ... "Négy & Nbsp; ... transaction.commit ()
& Nbsp; ...
& Nbsp; ... def fejlődnek (self, összefüggésben generáció):
& Nbsp; ... root = context.connection.root ()
& Nbsp; ... választ = root ['válaszok "]
& Nbsp; ... ha generációs == 1:
& Nbsp; ... a kérdés, válasz a answers.items ():
& Nbsp; ... választ [kérdés] = cgi.escape (válasz)
& Nbsp; ... elif generációs == 2:
& Nbsp; ... a kérdés, válasz a answers.items ():
& Nbsp; ... del választ [kérdés]
& Nbsp; ... választ [cgi.escape (kérdés)] = válasz
& Nbsp; ... else:
& Nbsp; ... fel ValueError ("Betli")
& Nbsp; ... gyökere ['választ'] = válaszokat # ping perzisztencia
& Nbsp; ... transaction.commit ()
& Nbsp; >>> manager = MySchemaManager ()
& Nbsp; >>> zope.component.provideUtility (manager, ISchemaManager, name = 'some.app)
Most, lehetővé teszi nyitni egy új adatbázis:
& Nbsp; >>> db.close ()
& Nbsp; >>> db = DB ()
& Nbsp; >>> kapcs = db.open ()
& Nbsp; >>> "választ" a conn.root ()
& Nbsp; False
& Nbsp; >>> event = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (esemény)
& Nbsp; >>> conn.sync ()
& Nbsp; >>> root = conn.root ()
& Nbsp; >>> pprint (root ["választ"])
& Nbsp; {'Hello': 'Hi-hogyan csinálod? ",
& Nbsp; "az élet értelme?": "42",
& Nbsp; "négy & Nbsp; >>> gyökér [generations_key] ['some.app']
& Nbsp; 2
A ZODB tranzakciós log megjegyzi, hogy a telepítő szkript kivégezték
& Nbsp; >>> [it.description meg azt conn.db (). Storage.iterator ()] [- 2]
& Nbsp; u'some.app: futás telepíteni generációs "
(Minor megjegyzés: ez nem az utolsó rekord, mert van két vállalkozik: MySchemaManager végez az egyik, és evolveMinimumSubscriber végez a második. MySchemaManager nem igazán kell köteleznie.)

Mi az új ebben a kiadásban:

  • A támogatás a Python 3.3.
  • A kicserélt elavult zope.interface.implements használata egyenértékű zope.interface.implementer lakberendező.
  • Eldobott támogatása Python 2.4-es és 2.5.

Mi az új verzióban 3.7.1:

  • Az eltávolított buildout része során használt fejlesztési de nem nem fordul le a Windows-t.
  • Generation scriptek hozzá a tranzakciós megjegyzést.

követelmények :

  • Python

Más szoftver fejlesztő Zope Corporation and Contributors

cipher.background
cipher.background

20 Feb 15

zope.index
zope.index

14 Apr 15

zope.tales
zope.tales

14 Apr 15

Hozzászólások a zope.generations

Hozzászólás nem található
Megjegyzés hozzáadása
Kapcsolja be a képeket!