zope.generations

Screenshot Software:
zope.generations
Mga detalye ng Software:
Bersyon: 4.0.0 Alpha 1
I-upload ang petsa: 15 Apr 15
Lisensya: Libre
Katanyagan: 2

Rating: nan/5 (Total Votes: 0)

zope.generations nagbibigay ng isang paraan ng pag-update ng mga bagay sa database kapag ang pagbabago ng schema application. & Nbsp; Ang isang schema application ay mahalagang istraktura ng data, ang istraktura ng mga klase sa kaso ng ZODB o ang paglalarawan sa talahanayan sa kaso ng isang pamanggit database.
Detalyadong Documentation
Henerasyon ay isang paraan ng pag-update ng mga bagay sa kapag ang mga pagbabago schema application database. Ang isang schema application ay mahalagang istraktura ng data, ang istraktura ng mga klase sa kaso ng ZODB o ang mga paglalarawan ng talahanayan sa kaso ng isang pamanggit database.
Kapag binago mo ang data ng mga istraktura ng iyong application, halimbawa, baguhin mo ang semantiko kahulugan ng isang umiiral na field sa isang klase, magkakaroon ka ng problema sa database na nilikha bago ang iyong pagbabago. Para sa mas masusing talakayan at mga posibleng solusyon, tingnan http://wiki.zope.org/zope3/DatabaseGenerations
Susundan natin ang paggamit ng arkitektura bahagi, at kailangan namin ng isang database at isang koneksyon:
& Nbsp; >>> import cgi
& Nbsp; >>> mula pprint import pprint
& Nbsp; >>> mula zope.interface import ipinapatupad ng
& Nbsp; >>> mula ZODB.tests.util import DB
& Nbsp; >>> db = DB ()
& Nbsp; >>> conn = db.open ()
& Nbsp; >>> ugat = conn.root ()
Isipin na ang aming application ay isang isang taong totoong marunong: maaari mong magturo ito sa reaksyon sa mga parirala. Hayaan ang panatilihin natin ito simple at mag-imbak ng data sa isang dict:
& Nbsp; >>> ugat ['sagot'] = {'Kamusta': '? Kumusta & paano mo gawin',
& Nbsp; ... '? Kahulugan ng buhay': '42',
& Nbsp; ... 'apat na & Nbsp; >>> import transaksyon
& Nbsp; >>> transaction.commit ()
Paunang pag-setup
Narito ang ilang henerasyon na tukoy code. Lilikha kami at magrehistro ng SchemaManager. SchemaManagers ay responsable para sa aktwal na mga pag-update ng database. Isa ito ay magiging isang dummy lamang. Ang punto dito ay ang gawin ang henerasyon module ng kamalayan na ang sumusuporta sa aming mga application na henerasyon.
Ang default na pagpapatupad ng SchemaManager ay hindi angkop para sa pagsusulit na ito dahil gumagamit ito Python module upang pamahalaan ang mga henerasyon. Sa ngayon, ito lamang fine, dahil hindi namin nais ito upang gumawa ng kahit ano sa ngayon.
& Nbsp; >>> mula zope.generations.interfaces-import ISchemaManager
& Nbsp; >>> mula zope.generations.generations-import SchemaManager
& Nbsp; >>> import zope.component
& Nbsp; >>> dummy_manager = SchemaManager (minimum_generation = 0, henerasyon = 0)
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... dummy_manager, ISchemaManager, pangalan = 'some.app')
'Some.app' ay isang natatanging identifier. Dapat mong gamitin ang isang URI o ang may mga tuldok na pangalan ng iyong package.
Kapag sinimulan mo ang Zope at isang database ay binuksan, ang isang IDatabaseOpenedWithRoot kaganapan ay naipadala na. Zope nagrerehistro evolveMinimumSubscriber bilang default bilang isang handler para sa kaganapang ito. Sabihin simulate na ito:
& Nbsp; >>> klase DatabaseOpenedEventStub (object):
& Nbsp; ... def __init __ (sa sarili, database):
& Nbsp; ... self.database = database
& Nbsp; >>> kaganapan = DatabaseOpenedEventStub (db)
& Nbsp; >>> mula zope.generations.generations-import evolveMinimumSubscriber
& Nbsp; >>> evolveMinimumSubscriber (kaganapan)
Ang kinahinatnan ng aksyon na ito ay na ngayon ang database ay naglalaman ng katotohanan na ating kasalukuyang bilang ng schema ay 0. Kapag nag-update namin ang schema, Zope3 ay magkakaroon ng ideya ng kung ano ang panimulang punto ay. Dito, makikita?
& Nbsp; >>> mula zope.generations.generations-import generations_key
& Nbsp; >>> ugat [generations_key] ['some.app']
& Nbsp; 0
Sa totoong buhay hindi ka dapat magkaroon sa pag-abala sa ang key na ito nang direkta, ngunit dapat mong malaman na ito ay umiiral na.
I-upgrade ang sitwasyong
Bumalik sa kuwento. Ang ilang mga oras pass at isa sa aming mga kliyente ay na-hack dahil nakalimutan namin upang makatakas sa HTML mga espesyal na character! Ang malaking sindak! Kailangan naming ayusin ang problemang ito sa lalong madaling panahon nang hindi nawawalan ng data. Magpasya namin na gamitin henerasyon upang mapabilib ang aming mga kapantay.
-Update ng ang schema manager (i-drop ang isang lumang at i-install ng isang bagong pasadyang isa) Hayaan ang:
& Nbsp; >>> mula zope.component import globalregistry
& Nbsp; >>> GSM = globalregistry.getGlobalSiteManager ()
& Nbsp; >>> gsm.unregisterUtility (ibinigay = ISchemaManager, pangalan = 'some.app')
& Nbsp; True
& Nbsp; >>> klase MySchemaManager (object):
& Nbsp; ... ipinapatupad ng (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... henerasyon = 2
& Nbsp; ...
& Nbsp; ... def magbabago (sarili, konteksto, henerasyon):
& Nbsp; ... na root = context.connection.root ()
& Nbsp; ... sagot = ugat ['sagot']
& Nbsp; ... kung henerasyon == 1:
& Nbsp; ... para sa tanong, sagot sa answers.items ():
& Nbsp; ... sagot [tanong] = cgi.escape (sagot)
& Nbsp; ... elif henerasyon == 2:
& Nbsp; ... para sa tanong, sagot sa answers.items ():
& Nbsp; ... del sagot [tanong]
& Nbsp; ... sagot [cgi.escape (tanong)] = sagot
& Nbsp; ... iba pa:
& Nbsp; ... taasan ValueError ("Nakakainis")
& Nbsp; ... ugat ['sagot'] = kasagutan # ping pagtitiyaga
& Nbsp; ... transaction.commit ()
& Nbsp; >>> manager = MySchemaManager ()
& Nbsp; >>> zope.component.provideUtility (manager, ISchemaManager, pangalan = 'some.app')
Nagtakda kami ng minimum_generation sa 1. Ibig sabihin na ang aming application ay tanggihan upang tumakbo kasama ang isang database na mas luma sa pagbuo ng 1. Ang pagbuo ng katangian ay nakatakda sa 2, na nangangahulugan na ang mga pinakabagong henerasyon na nakakaalam na ito SchemaManager tungkol ay 2.
magbabago () ay ang workhorse dito. Nito trabaho ay upang makakuha ng database mula sa henerasyon-1 na henerasyon. Ito ay makakakuha ng isang konteksto na may katangiang 'koneksyon', na isang koneksyon sa ZODB. Maaari mong gamitin iyon upang baguhin ang mga bagay tulad ng sa halimbawang ito.
Sa partikular na henerasyon pagpapatupad 1 escapes ang mga sagot (sabihin nating, kritikal, dahil sila ay ipinasok sa pamamagitan ng sinuman!), Henerasyon 2 escapes ang mga tanong (sabihin nating, mas mahalaga, dahil ang mga maaaring ilagay sa pamamagitan ng awtorisadong personell lamang).
Sa katunayan, hindi mo talagang kailangan ng isang pasadyang pagpapatupad ng ISchemaManager. Ang isa ay magagamit, ginamit namin ito para sa isang dummy dati. Gumagamit ito ng Python mga module para sa mga samahan ng evolver function. Tingnan docstring nito para sa karagdagang impormasyon.
Sa totoong buhay magkakaroon ka ng mas kumplikadong mga istraktura na bagay kaysa sa isa dito. Upang gawing mas madali ang iyong buhay, mayroong dalawang napaka-kapaki-pakinabang na mga function na magagamit sa zope.generations.utility: findObjectsMatching () at findObjectsProviding (). Sila ay kumuha sa lupa sa pamamagitan ng mga lalagyan recursively upang matulungan kang humingi ng mga lumang bagay na nais mong i-update, sa pamamagitan ng interface o sa pamamagitan ng ilang mga iba pang pamantayan. Ang mga ito ay madaling maunawaan, suriin ang kanilang mga docstrings.
henerasyon sa pagkilos
Kaya, nagda-download ng aming mga kliyente galit na galit ang aming mga pinakabagong code at restart Zope. Ang kaganapan ay awtomatikong muling ipinadala:
& Nbsp; >>> kaganapan = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (kaganapan)
Shazam! Client ay masaya muli!
& Nbsp; >>> pprint (ugat ['sagot'])
& Nbsp; {'Kamusta': 'Hi & paano mo gawin?',
& Nbsp; 'Kahulugan ng buhay?': '42',
& Nbsp; 'apat na Dahil evolveMinimumSubscriber ay napaka-tamad,-a-update lamang nito ang database ng sapat lamang upang maaari itong gamitin sa iyong application (sa minimum_generation, iyon ay). Sa katunayan, nagpapahiwatig ang marker na ang pagbuo ng database ay Uusog hanggang 1:
& Nbsp; >>> ugat [generations_key] ['some.app']
& Nbsp; 1
Nakita namin na henerasyon ay nagtatrabaho, kaya nagpasya na gawin ang mga susunod na hakbang at nagbabago sa pagbuo ng 2. Tingnan natin kung paano ito maaaring manu-manong tapos Hayaan ang:
& Nbsp; >>> mula zope.generations.generations-import ay magbabago
& Nbsp; >>> magbabago (db)
& Nbsp; >>> pprint (ugat ['sagot'])
& Nbsp; {'Kamusta': 'Hi & paano mo gawin?',
& Nbsp; 'Kahulugan ng buhay?': '42',
& Nbsp; 'apat na & Nbsp; >>> ugat [generations_key] ['some.app']
& Nbsp; 2
Default na pag-uugali ng pagbabago ng mga upgrade sa pinakabagong henerasyon na ibinigay ng SchemaManager. Maaari mong gamitin ang kung paano argumento sa magbabago () kapag gusto mong tingnan lamang kung kailangan mong i-update o kung gusto mong maging tamad tulad ng subscriber kung saan namin na tinatawag na dati.
Pagkakasunud-sunod ng schema mga tagapamahala
Madalas subsystems na ginagamit upang bumuo ng isang application ay umaasa sa iba pang mga subsystems upang patakbuhin maayos. Kung ang parehong subsystems magbigay ng schema manager, ito ay madalas na kapaki-pakinabang na malaman ang pagkakasunod-sunod kung saan ang evolvers ay mahihingi. Nagbibigay-daan ito sa isang framework at ito ay mga kliyente upang magawang ay magbabago sa konsyerto, at maaaring malaman ang mga client na ang balangkas ay lumaki bago o pagkatapos mismo.
Ito ay maaaring natapos sa pamamagitan ng pagkontrol ng mga pangalan ng mga schema manager utilities. Ang schema mga tagapamahala ay tumakbo sa pagkakasunud-sunod tinutukoy sa pamamagitan ng pagbubukod-bukod ng kanilang mga pangalan.
& Nbsp; >>> manager1 = SchemaManager (minimum_generation = 0, henerasyon = 0)
& Nbsp; >>> manager2 = SchemaManager (minimum_generation = 0, henerasyon = 0)
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... manager1, ISchemaManager, pangalan = 'another.app')
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... manager2, ISchemaManager, pangalan = 'another.app-extension')
Pansinin kung paano ang pangalan ng unang pakete ay ginagamit upang lumikha ng isang namespace para sa mga umaasang mga pakete. Ito ay hindi isang kinakailangan ng framework, ngunit isang maginhawang pattern para sa paggamit na ito.
Hayaan ang magbabago sa buong database upang magtatag ng mga henerasyon:
& Nbsp; >>> kaganapan = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (kaganapan)
& Nbsp; >>> ugat [generations_key] ['another.app']
& Nbsp; 0
& Nbsp; >>> ugat [generations_key] ['another.app-extension']
& Nbsp; 0
Ipagpalagay na para sa ilang mga dahilan bawat isa sa mga subsystems kailangang magdagdag ng isang henerasyon, at na henerasyon 1 ng 'another.app-extension' ay depende sa henerasyon 1 ng 'another.app' Hayaan. Kakailanganin naming magbigay ng schema mga tagapamahala para sa bawat tala na na ito ay nai-tumakbo upang maaari naming i-verify ang resulta:
& Nbsp; >>> gsm.unregisterUtility (ibinigay = ISchemaManager, pangalan = 'another.app')
& Nbsp; True
& Nbsp; >>> gsm.unregisterUtility (
& Nbsp; ... ibinigay = ISchemaManager, pangalan = 'another.app-extension')
& Nbsp; True
& Nbsp; >>> klase FoundationSchemaManager (object):
& Nbsp; ... ipinapatupad ng (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... henerasyon = 1
& Nbsp; ...
& Nbsp; ... def magbabago (sarili, konteksto, henerasyon):
& Nbsp; ... na root = context.connection.root ()
& Nbsp; ... pag-order = root.get ('pag-order', [])
& Nbsp; ... kung henerasyon == 1:
& Nbsp; ... ordering.append ('pundasyon 1')
& Nbsp; ... naka-print na 'pundasyon henerasyon 1'
& Nbsp; ... iba pa:
& Nbsp; ... taasan ValueError ("Nakakainis")
& Nbsp; ... ugat ['pag-order'] = pag-order # ping pagtitiyaga
& Nbsp; ... transaction.commit ()
& Nbsp; >>> klase DependentSchemaManager (object):
& Nbsp; ... ipinapatupad ng (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... henerasyon = 1
& Nbsp; ...
& Nbsp; ... def magbabago (sarili, konteksto, henerasyon):
& Nbsp; ... na root = context.connection.root ()
& Nbsp; ... pag-order = root.get ('pag-order', [])
& Nbsp; ... kung henerasyon == 1:
& Nbsp; ... ordering.append ('nakadepende 1')
& Nbsp; ... naka-print na 'umaasa henerasyon 1'
& Nbsp; ... iba pa:
& Nbsp; ... taasan ValueError ("Nakakainis")
& Nbsp; ... ugat ['pag-order'] = pag-order # ping pagtitiyaga
& Nbsp; ... transaction.commit ()
& Nbsp; >>> manager1 = FoundationSchemaManager ()
& Nbsp; >>> manager2 = DependentSchemaManager ()
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... manager1, ISchemaManager, pangalan = 'another.app')
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... manager2, ISchemaManager, pangalan = 'another.app-extension')
Umuunlad ang database ngayon ay palaging patakbuhin ang 'another.app' evolver bago ang 'another.app-extension' evolver:
& Nbsp; >>> kaganapan = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (kaganapan)
& Nbsp; pundasyon henerasyon 1
& Nbsp; umaasa henerasyon 1
& Nbsp; >>> ugat ['pag-order']
& Nbsp; ['pundasyon 1', 'nakadepende 1']
Pag-install
Sa halimbawa sa itaas, mano-mano naming nasimulan ang sagot. Hindi namin ay dapat may gawin na mano-mano. Dapat na gawin na awtomatikong application ay.
IInstallableSchemaManager umaabot ISchemaManager, na nagbibigay ng isang paraan para i-install ang gumaganap ng isang intial-install ng isang application. Ito ay isang mas mahusay na alternatibo kaysa sa pagrehistro ng database Nabuksan subscriber.
Hayaan tukuyin ang isang bagong schema manager na kabilang ang pag-install:
& Nbsp; >>> gsm.unregisterUtility (ibinigay = ISchemaManager, pangalan = 'some.app')
& Nbsp; True
& Nbsp; >>> mula zope.generations.interfaces-import IInstallableSchemaManager
& Nbsp; >>> klase MySchemaManager (object):
& Nbsp; ... ipinapatupad ng (IInstallableSchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... henerasyon = 2
& Nbsp; ...
& Nbsp; ... def i-install (sa sarili, konteksto):
& Nbsp; ... na root = context.connection.root ()
& Nbsp; ... ugat ['sagot'] = {'Kamusta': '? Kumusta & paano mo gawin',
& Nbsp; ... '? Kahulugan ng buhay': '42',
& Nbsp; ... 'apat na & Nbsp; ... transaction.commit ()
& Nbsp; ...
& Nbsp; ... def magbabago (sarili, konteksto, henerasyon):
& Nbsp; ... na root = context.connection.root ()
& Nbsp; ... sagot = ugat ['sagot']
& Nbsp; ... kung henerasyon == 1:
& Nbsp; ... para sa tanong, sagot sa answers.items ():
& Nbsp; ... sagot [tanong] = cgi.escape (sagot)
& Nbsp; ... elif henerasyon == 2:
& Nbsp; ... para sa tanong, sagot sa answers.items ():
& Nbsp; ... del sagot [tanong]
& Nbsp; ... sagot [cgi.escape (tanong)] = sagot
& Nbsp; ... iba pa:
& Nbsp; ... taasan ValueError ("Nakakainis")
& Nbsp; ... ugat ['sagot'] = kasagutan # ping pagtitiyaga
& Nbsp; ... transaction.commit ()
& Nbsp; >>> manager = MySchemaManager ()
& Nbsp; >>> zope.component.provideUtility (manager, ISchemaManager, pangalan = 'some.app')
Ngayon, hinahayaan magbukas ng bagong database:
& Nbsp; >>> db.close ()
& Nbsp; >>> db = DB ()
& Nbsp; >>> conn = db.open ()
& Nbsp; >>> 'sagot' sa conn.root ()
& Nbsp; Mali
& Nbsp; >>> kaganapan = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (kaganapan)
& Nbsp; >>> conn.sync ()
& Nbsp; >>> ugat = conn.root ()
& Nbsp; >>> pprint (ugat ['sagot'])
& Nbsp; {'Kamusta': 'Hi & paano mo gawin?',
& Nbsp; 'Kahulugan ng buhay?': '42',
& Nbsp; 'apat na & Nbsp; >>> ugat [generations_key] ['some.app']
& Nbsp; 2
Mga tala Ang log ZODB transaksyon na aming i-install ang script ay pinaandar
& Nbsp; >>> [. It.description ito sa conn.db () storage.iterator ()] [- 2]
& Nbsp; u'some.app: tumatakbo-install na henerasyon '
(Minor tala: hindi huling record dahil mayroong dalawang gumawa: MySchemaManager ay gumaganap ng isa, at evolveMinimumSubscriber gumaganap ang pangalawang isa MySchemaManager ay hindi talagang kailangan na gumawa..)

Ano ang bagong sa paglabas:.

  • Nagdagdag ng suporta para sa Python 3.3
  • Pinalitan ng paggamit hindi na ginagamit zope.interface.implements may katumbas zope.interface.implementer dekorador.
  • -drop na suporta para sa Python 2.4 at 2.5.

Ano ang bagong sa bersyon 3.7.1:

  • Inalis buildout bahagi kung saan ito ay ginamit sa panahon ng pag-unlad ngunit ang hindi sumulat ng libro sa Windows.
  • Pagbuo ng mga script magdagdag ng tala transaksyon.

Mga Kinakailangan :

  • Python

Iba pang mga software developer ng Zope Corporation and Contributors

cipher.background
cipher.background

20 Feb 15

zc.resourcelibrary
zc.resourcelibrary

15 Apr 15

zope.i18n
zope.i18n

15 Apr 15

Mga komento sa zope.generations

Mga Komento hindi natagpuan
Magdagdag ng komento
I-sa mga imahe!