zope.generations

Софтуер снимки:
zope.generations
Софтуер детайли:
Версия: 4.0.0 Alpha 1
Дата на качване: 15 Apr 15
Разрешително: Безплатно
Популярност: 37

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; >>> вр = db.open ()
& Nbsp; >>> корен = conn.root ()
Представете си, че нашата молба е оракул: можете да го научи да реагира на фрази. Нека да бъдем ясни и съхраняване на данните в Dict:
& Nbsp; ['отговори'] >>> корен = {"Hello": "Здравейте и как се прави",
& Nbsp; ... "? Смисълът на живота": "42",
& Nbsp; ... "четири & Nbsp; >>> сделка за внос
& Nbsp; >>> transaction.commit ()
<Силен> Начална настройка
Ето част от поколения-специфични код. Ние ще създадем и регистрира SchemaManager. SchemaManagers са отговорни за действителните актуализиране на базата данни. Това ще бъде просто сляпо. Важното в случая е да се направи поколенията модул наясно, че нашата молба поддържа поколения.
Изпълнението на неизпълнение на SchemaManager не е подходящ за този тест, защото използва Python модули за управление на поколения. За сега, тя ще се оправи, тъй като ние не искаме това да се направи нищо, просто все още.
& 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 (събитие)
Последицата от това действие е, че в момента базата данни съдържа факта, че сегашната ни брой схема е 0. Когато се актуализира схемата, Zope3 ще имат представа за това, което е отправната точка. Ето, виждаш ли?
& Nbsp; >>> от zope.generations.generations внасят generations_key
& Nbsp; >>> корен [generations_key] ['some.app "]
& Nbsp; 0
В реалния живот, че никога не трябва да се занимавам с този ключ директно, но трябва да сте наясно, че той съществува.
<Силен> Upgrade сценарий
Върнете се в историята. Мине известно време и един от нашите клиенти получава хакнат защото забравих да избягат HTML специални символи! Ужасът! Ние трябва да решим проблема ASAP, без да губи всички данни. Ние реши да използва поколения да впечатли нашите връстници.
Нека да актуализирате управителя на схема (пуснете старата и инсталиране на нов потребителски едно):
& Nbsp; >>> от zope.component внос globalregistry
& Nbsp; >>> GSM = globalregistry.getGlobalSiteManager ()
& Nbsp; >>> gsm.unregisterUtility (при условие = ISchemaManager, име = "some.app")
& Nbsp; True
& 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; ... Елиф поколение == 2:
& Nbsp; ... за въпрос, отговор в answers.items ():
& Nbsp; ... дел отговори [въпрос]
& Nbsp; ... отговори [cgi.escape (въпрос)] = отговор
& Nbsp; ... друго:
& Nbsp; ... повиши ValueError ("Лентяй")
& Nbsp; корен ['отговори'] ... = отговори # пинг упоритост
& 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. Един от тях е на разположение, като ги използва за сляпо-рано. Той използва Python модули за организация на evolver функции. Вижте своя docstring за повече информация.
В реалния живот ще имате много по-сложен обект структури, различни от този тук. За да направят живота ви по-лесно, има две много полезни функции, налични в zope.generations.utility: findObjectsMatching () и findObjectsProviding (). Те ще се копае чрез контейнери рекурсивно да ви помогне да се търсят стари предмети, които искате да се актуализират, като интерфейс или от някои други критерии. Те са лесни за разбиране, проверете си docstrings.
<Силни> поколения в действие
Така че, нашата бесен Клиент изтегли най-новите ни код и рестартира Zope. Събитието автоматично се изпраща отново:
& Nbsp; >>> събитие = DatabaseOpenedEventStub (DB)
& Nbsp; >>> evolveMinimumSubscriber (събитие)
Shazam! Клиентът отново е щастлив!
(['Отговори'] корен) >>> pprint; & Nbsp
& Nbsp; {"Hello": "Здравейте и как се прави?",
& Nbsp; "смисълът на живота?": "42",
& Nbsp; "четири Защото evolveMinimumSubscriber е много мързелив, тя само се актуализира базата данни трябва да е достатъчно, че приложението ви може да го използвате (до minimum_generation, че е). Всъщност, маркерът показва, че генерирането на базата данни е ударих до 1:
& Nbsp; >>> корен [generations_key] ['some.app "]
& Nbsp; 1
Ние виждаме, че поколения са на работа, за да можем да реши да предприеме следващата стъпка и да се развива в поколение 2. Нека да видим как това може да стане ръчно:
& Nbsp; >>> от zope.generations.generations внасят развива
& Nbsp; >>> развива (DB)
(['Отговори'] корен) >>> pprint; & Nbsp
& Nbsp; {"Hello": "Здравейте и как се прави?",
& Nbsp; "смисълът на живота?": "42",
& Nbsp; "четири & Nbsp; >>> корен [generations_key] ['some.app "]
& Nbsp; 2
Поведението по подразбиране на EVOLVE ъпгрейди за най-новото поколение, предоставена от 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-разширение")
Забележете как името на първия пакет се използва за създаване на пространство от имена за зависими пакети. Това не е изискване на рамката, но удобен модел за нейното използване.
Нека да се развива на базата данни, за да се установят тези поколения:
& Nbsp; >>> събитие = DatabaseOpenedEventStub (DB)
& Nbsp; >>> evolveMinimumSubscriber (събитие)
& 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; True
& Nbsp; >>> gsm.unregisterUtility (
& Nbsp; ... условие = ISchemaManager, име = "another.app-разширение")
& Nbsp; True
& 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; ... "поколение фондация 1" печат
& Nbsp; ... друго:
& Nbsp; ... повиши ValueError ("Лентяй")
& Nbsp; ... корен ["поръчка"] = поръчване # пинг упоритост
& 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; ... корен ["поръчка"] = поръчване # пинг упоритост
& 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 (събитие)
& Nbsp; поколение фондация 1
& Nbsp; зависима поколение 1
& Nbsp; >>> корен ["поръчка"]
& Nbsp; ["Фондация 1", "зависими 1"]
<Силен> Монтаж
В примера по-горе, ние ръчно инициализира отговорите. Ние не трябва да има, за да направите това ръчно. Заявлението трябва да бъде в състояние да направи това автоматично.
IInstallableSchemaManager простира ISchemaManager, предоставяне на метода на инсталация за извършване на първоначална инсталация на заявление. Това е по-добра алтернатива от регистрирането на абонатите на бази данни с отворен.
Нека да определи нова схема за управление, която включва монтаж:
& Nbsp; >>> gsm.unregisterUtility (при условие = ISchemaManager, име = "some.app")
& Nbsp; True
& Nbsp; >>> от zope.generations.interfaces внасят IInstallableSchemaManager
& Nbsp; >>> клас MySchemaManager (обект):
& Nbsp; ... сечива (IInstallableSchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... поколение = 2
& Nbsp; ...
& Nbsp; ... Def инсталиране (самостоятелно, контекст):
& Nbsp; ... корен = context.connection.root ()
& Nbsp; ... корен ['отговори'] = {"Hello": "Здравейте и как се прави",
& Nbsp; ... "? Смисълът на живота": "42",
& Nbsp; ... "четири & Nbsp; ... transaction.commit ()
& Nbsp; ...
& Nbsp; ... Def развива (самостоятелно, контекст поколение):
& Nbsp; ... корен = context.connection.root ()
Nbsp &; ... отговори ['отговори'] = корен
& Nbsp; ... ако поколение == 1:
& Nbsp; ... за въпрос, отговор в answers.items ():
& Nbsp; ... отговори [въпрос] = cgi.escape (отговор)
& Nbsp; ... Елиф поколение == 2:
& Nbsp; ... за въпрос, отговор в answers.items ():
& Nbsp; ... дел отговори [въпрос]
& Nbsp; ... отговори [cgi.escape (въпрос)] = отговор
& Nbsp; ... друго:
& Nbsp; ... повиши ValueError ("Лентяй")
& Nbsp; корен ['отговори'] ... = отговори # пинг упоритост
& Nbsp; ... transaction.commit ()
& Nbsp; >>> мениджър = MySchemaManager ()
& Nbsp; >>> zope.component.provideUtility (мениджър, ISchemaManager, име = "some.app")
Сега, нека се отвори нова база данни:
& Nbsp; >>> db.close ()
& Nbsp; >>> db = DB ()
& Nbsp; >>> вр = db.open ()
& Nbsp; >>> "отговори" в conn.root ()
& Nbsp; False
& Nbsp; >>> събитие = DatabaseOpenedEventStub (DB)
& Nbsp; >>> evolveMinimumSubscriber (събитие)
& Nbsp; >>> conn.sync ()
& Nbsp; >>> корен = conn.root ()
(['Отговори'] корен) >>> pprint; & Nbsp
& Nbsp; {"Hello": "Здравейте и как се прави?",
& Nbsp; "смисълът на живота?": "42",
& Nbsp; "четири & Nbsp; >>> корен [generations_key] ['some.app "]
& Nbsp; 2
Дневникът на ZODB сделка отбелязва, че нашата инсталирате скрипт е бил екзекутиран
& Nbsp; >>> [. It.description за него в conn.db () storage.iterator ()] [- 2]
& Nbsp; u'some.app: тичане инсталирате поколение "
(Minor бележка: това не е последния запис, защото има две задължава да: MySchemaManager изпълнява една и evolveMinimumSubscriber изпълнява втората MySchemaManager наистина не трябва да се ангажират..)

Какво ново в тази версия:.

  • Добавена е поддръжка за Python 3.3
  • Заменен отхвърлена ползване zope.interface.implements с равностоен zope.interface.implementer декоратор.
  • Окачен подкрепа за Python 2.4 и 2.5.

Какво ново във версия 3.7.1:

  • Премахнато buildout част, която се използва по време на строителство, но прави не събират на Windows.
  • поколение скриптове добавите бележка сделка.

<силни> Изисквания :

  • Python

Друг софтуер на разработчика Zope Corporation and Contributors

zope.index
zope.index

14 Apr 15

zope.contenttype
zope.contenttype

11 May 15

five.customerize
five.customerize

20 Feb 15

Коментари към zope.generations

Коментари не е намерена
добавите коментар
Включете на изображения!