zope.generations

Yazılım ekran görüntüsü:
zope.generations
Yazılım detaylar:
Versiyon: 4.0.0 Alpha 1
Qayıt: 15 Apr 15
Lisans: Ücretsiz
Popülerlik: 37

Rating: nan/5 (Total Votes: 0)

zope.generations veritabanındaki nesneleri güncellenmesi bir yol sağlar, uygulama şema değişiklikleri. & Nbsp; Bir uygulama şeması esas verilerin yapısı, ZODB durumunda ya durumunda tablo açıklamaları sınıfların yapısı bir ilişkisel veritabanı.
Detaylı Belgeler
Nesiller veritabanı uygulaması şema değişiklikleri nesneleri güncellenmesi bir yoldur. Bir uygulama şeması temel veri yapısı, ZODB veya ilişkisel veritabanı durumda tablo açıklamaları halinde sınıflarının yapısı.
Eğer uygulamanın veri yapılarını değiştirdiğinizde, örneğin, bir sınıfta varolan alanın semantik anlamını değiştirmek, sizin değişiklikten önce oluşturulan veritabanları ile bir sorun olacaktır. Daha ayrıntılı tartışma ve olası çözümler için, bkz http://wiki.zope.org/zope3/DatabaseGenerations
Biz bileşen mimarisi kullanarak olacak, ve biz bir veritabanı ve bağlantı gerekir:
& Nbsp; >>> import cgi
& Nbsp; >>> pprint ithalat pprint gelen
& Nbsp; >>> zope.interface ithalat uygular gelen
& Nbsp; >>> gelen ZODB.tests.util ithalat DB
& Nbsp; >>> db = DB ()
& Nbsp; >>> bağl = Db.Open ()
& Nbsp; >>> kök = conn.root ()
Bizim uygulama bir kehanet olduğunu düşünün: Eğer sözcük tepki için öğreteceğiz. En basit tutmak ve bir dict veri depolamak edelim:
& Nbsp; >>> root ['cevaplar'] = {'Merhaba': 'Merhaba & yapmanız nasıl',
& Nbsp; ... '? Yaşamın anlamı': '42',
& Nbsp; ... 'Dört & Nbsp; >>> import işlemi
& Nbsp; >>> transaction.commit ()
İlk kurulum
İşte bazı nesiller özgü kodu. Biz oluşturmak ve bir SchemaManager kaydedecektir. SchemaManagers veritabanı güncellemeleri gerçek sorumludur. Bu bir sadece bir kukla olacak. Burada nokta nesiller bizim uygulama nesillere destekler farkında modülü yapmaktır.
o nesillere yönetmek için Python modülleri kullanır, çünkü SchemaManager varsayılan uygulama bu test için uygun değildir. Biz henüz bir şey yapmak istemiyorum çünkü şimdi, o, sadece iyi olacak.
& Nbsp; >>> zope.generations.interfaces ISchemaManager ithal gelen
& Nbsp; >>> zope.generations.generations SchemaManager ithal gelen
& Nbsp; >>> import zope.component
& Nbsp; >>> dummy_manager = SchemaManager (minimum_generation = 0, kuşak = 0)
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... dummy_manager, ISchemaManager, name = 'some.app')
'Some.app' benzersiz bir tanımlayıcı. Bir URI veya paketinin noktalı adını kullanmanız gerekir.
Zope başlangıç ​​ve bir veri tabanı açıldığında, bir olay IDatabaseOpenedWithRoot gönderilir. Zope bu olay için bir işleyici olarak varsayılan evolveMinimumSubscriber kaydeder. Şimdi bu taklit edelim:
& Nbsp; >>> sınıf DatabaseOpenedEventStub (nesne):
& Nbsp; ... def __init __ (self, veritabanı):
& Nbsp; ... self.database = veritabanı
& Nbsp; >>> olay = DatabaseOpenedEventStub (db)
& Nbsp; >>> zope.generations.generations evolveMinimumSubscriber ithal gelen
& Nbsp; >>> evolveMinimumSubscriber (olay)
Bu eylemin sonucu şimdi veritabanı mevcut şema numarası Biz şemasını güncelleştirmek zaman Zope3 başlangıç ​​noktası ne bir fikir olacaktır 0 olduğu gerçeğini içeriyor olmasıdır. Burada, gördün mü?
& Nbsp; >>> zope.generations.generations generations_key ithal gelen
& Nbsp; >>> kök [generations_key] ['some.app']
& Nbsp; 0
Gerçek hayatta doğrudan bu anahtar ile uğraşmak zorunda asla, ama onun var olduğunu farkında olmalıdır.
Yükseltme senaryo
Geri hikaye. Bir süre geçer ve HTML özel karakterler kaçmak için unuttum çünkü müşterilerimizin biri kesmek olur! korku! Biz herhangi bir veri kaybetmeden en kısa sürede bu sorunu gidermek gerekir. Biz bizim Akranları etkilemek için nesiller kullanmaya karar.
En şema yöneticisi güncellemek (eskisini bırakıp yeni bir özel bir yükleme) Let:
& Nbsp; >>> zope.component ithalat globalregistry gelen
& Nbsp; >>> gsm = globalregistry.getGlobalSiteManager ()
& Nbsp; >>> gsm.unregisterUtility (sağlanan = ISchemaManager, name = 'some.app')
& Nbsp; Doğru
& Nbsp; >>> sınıf MySchemaManager (nesne):
& Nbsp; ... uygular (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... nesil = 2
& Nbsp; ...
& Nbsp; ... def (öz, bağlam, nesil) gelişmeye:
& Nbsp; ... Kök = context.connection.root ()
& Nbsp; ... cevaplar = root ['cevaplar']
& Nbsp; ... eğer nesil == 1:
& Nbsp; ... soru için, answers.items içinde cevap ():
& Nbsp; ... cevaplar [Soru] = cgi.escape (cevap)
& Nbsp; ... elif nesil == 2:
& Nbsp; ... soru için, answers.items içinde cevap ():
& Nbsp; ... del cevaplar [soru]
& Nbsp; ... cevaplar [cgi.escape (soru)] = cevap
& Nbsp; ... else:
& Nbsp; ... ("serseri") ValueError yükseltmek
& Nbsp; ... root ['cevaplar'] cevapları # ping kalıcılığını =
& Nbsp; ... transaction.commit ()
& Nbsp; >>> yöneticisi = MySchemaManager ()
& Nbsp; >>> zope.component.provideUtility (yönetici, ISchemaManager, name = 'some.app')
Biz bizim uygulama bu SchemaManager bilir en son nesil yaklaşık 2 demektir nesil özniteliği 2'ye ayarlanır nesil 1. daha büyük bir veritabanı ile çalışacak reddeder anlamına Yani 1. minimum_generation belirledik.
() gelişmeye beygir burada. Onun işi nesil-1 nesile veritabanı elde etmektir. Bu ZODB bir bağlantı niteliği 'bağlantısı', sahip bir bağlam alır. Bu örnekte olduğu gibi nesneleri değiştirmek için kullanabilirsiniz.
(Bunlar herkes tarafından girilebilir, çünkü kritik diyelim!) Bu özel uygulama nesilde 1 cevaplar kaçar, nesil 2 soru kaçar (daha az önemli demek, bu yetkili personellerimiz tarafından sadece girilebilir çünkü).
Aslında, gerçekten ISchemaManager özel bir uygulama gerekmez. Bir daha önce bir manken için kullanmış, mevcuttur. Bu evolver fonksiyonlarının organizasyonu için Python modülleri kullanır. Daha fazla bilgi için docstring'ini bakınız.
Gerçek hayatta burada birden çok daha karmaşık nesne yapıları vardır. FindObjectsMatching () ve findObjectsProviding (): hayatınızı kolaylaştırmak için, zope.generations.utility mevcut iki çok kullanışlı fonksiyonlar vardır. Onlar size arabirimi veya diğer bazı kriterlere göre, güncellemek isteyen eski nesneleri ararlar yardımcı ardışık kaplarda kazmak olacak. Onlar doc dizgilerini kontrol anlamak kolaydır.
Eylem Nesiller
Yani, bizim öfkeli müşteri bizim en son kod indirir ve Zope yeniden başlatır. Olay otomatik olarak yeniden gönderilir:
& Nbsp; >>> olay = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (olay)
Shazam! İstemci yine mutlu!
& Nbsp; >>> pprint (root ['cevaplar'])
& Nbsp; {'Merhaba': 'Selam & yapmanız nasıl?',
& Nbsp; 'hayatın anlamı?' '42',
& Nbsp; 'dört EvolveMinimumSubscriber çok tembel olduğundan uygulama kullanabilirsiniz, böylece sadece yeterli veritabanını günceller (minimum_generation, yani). Nitekim, işaretleyici veritabanı nesil 1 çarpıyordu olduğunu gösterir:
& Nbsp; >>> kök [generations_key] ['some.app']
& Nbsp; 1
Biz nesillerin çalıştığını görmek, bu yüzden en bu elle nasıl yapılabilir görelim sonraki adımı atmaya ve nesilden 2. gelişmeye karar:
& Nbsp; >>> zope.generations.generations gelişmeye ithalat gelen
& Nbsp; >>> (db) gelişmeye
& Nbsp; >>> pprint (root ['cevaplar'])
& Nbsp; {'Merhaba': 'Selam & yapmanız nasıl?',
& Nbsp; 'hayatın anlamı?' '42',
& Nbsp; 'dört & Nbsp; >>> kök [generations_key] ['some.app']
& Nbsp; 2
SchemaManager tarafından sağlanan en son nesil evrim geçirmekte yükseltmeleri varsayılan davranış. Eğer güncellemeniz gerekiyorsa veya daha önce aradığınız abonenin gibi tembel olmak istiyorsanız, sadece kontrol etmek istediğiniz zaman) (gelişmeye nasıl argümanını kullanabilirsiniz.
şema yöneticilerinin Sipariş
Sık düzgün çalışması için diğer alt güveniyor bir uygulama oluşturmak için kullanılan alt sistemler. Her iki alt şema yöneticileri sağlamak, bu evolvers çağrılan sırayı bilmek çok yararlı olduğunu. Bu çerçeve sağlar ve müşterilerine konser gelişmeye muktedir olduğunu, ve müşteriler çerçevesi önce veya sonra kendisi evrimleşmiş olacağını biliyorsunuz.
Bu şema yöneticisi yarar isimlerini kontrol ederek gerçekleştirilebilir. şema yöneticileri isimlerini sıralayarak belirlenen sırayla çalıştırılır.
& Nbsp; >>> Manager1 = SchemaManager (minimum_generation = 0, kuşak = 0)
& Nbsp; >>> manager2 = SchemaManager (minimum_generation = 0, kuşak = 0)
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... Manager1, ISchemaManager, name = 'another.app')
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... manager2, ISchemaManager, name = 'another.app-uzantısı')
İlk paketin adı bağımlı paketler için bir ad alanı oluşturmak için nasıl kullanıldığını dikkat edin. Bu çerçevede bir gereklilik, ancak bu kullanım için uygun bir model değildir.
Şimdi bu nesilleri kurmak için veritabanı dönüşmeye edelim:
& Nbsp; >>> olay = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (olay)
& Nbsp; >>> kök [generations_key] ['another.app']
& Nbsp; 0
& Nbsp; >>> kök [generations_key] ['another.app-uzantı']
& Nbsp; 0
En nedense bu alt sistemlerin her biri bir nesil eklemek gerekiyor, ve 'another.app-uzantısı' bu kuşak 1 'another.app' üretimi 1 bağlıdır varsayalım. Biz onlar kadar biz sonucu doğrulamak çalıştırmak oldum her o kayıt için şema yöneticileri sağlamak gerekir:
& Nbsp; >>> gsm.unregisterUtility (sağlanan = ISchemaManager, name = 'another.app')
& Nbsp; Doğru
& Nbsp; >>> gsm.unregisterUtility (
& Nbsp; ... sağlanan = ISchemaManager, name = 'another.app-uzantısı')
& Nbsp; Doğru
& Nbsp; >>> sınıf FoundationSchemaManager (nesne):
& Nbsp; ... uygular (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... nesil = 1
& Nbsp; ...
& Nbsp; ... def (öz, bağlam, nesil) gelişmeye:
& Nbsp; ... Kök = context.connection.root ()
& Nbsp; ... sipariş = root.get ('sipariş', [])
& Nbsp; ... eğer nesil == 1:
& Nbsp; ... ordering.append ('vakıf 1')
& Nbsp; ... print 'vakıf nesil 1'
& Nbsp; ... else:
& Nbsp; ... ("serseri") ValueError yükseltmek
& Nbsp; ... root ['sipariş'] = sipariş # ping sebat
& Nbsp; ... transaction.commit ()
& Nbsp; >>> sınıf DependentSchemaManager (nesne):
& Nbsp; ... uygular (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... nesil = 1
& Nbsp; ...
& Nbsp; ... def (öz, bağlam, nesil) gelişmeye:
& Nbsp; ... Kök = context.connection.root ()
& Nbsp; ... sipariş = root.get ('sipariş', [])
& Nbsp; ... eğer nesil == 1:
& Nbsp; ... ordering.append ('bağımlı 1')
& Nbsp; ... print 'bağımlı nesil 1'
& Nbsp; ... else:
& Nbsp; ... ("serseri") ValueError yükseltmek
& Nbsp; ... root ['sipariş'] = sipariş # ping sebat
& 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-uzantısı')
Her zaman evolver evolver 'another.app-uzantısı' önce 'another.app' çalışacaktır şimdi veritabanı Gelişen:
& Nbsp; >>> olay = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (olay)
& Nbsp; vakıf nesil 1
& Nbsp; bağımlı nesil 1
& Nbsp; >>> root ['sipariş']
& Nbsp; ['vakıf 1', 'bağımlı 1']
Kurulum
Yukarıdaki örnekte, elle cevapları başlatıldı. Biz el ile yapmak zorunda olmamalıdır. Uygulama otomatik olarak yapmak gerekir.
IInstallableSchemaManager bir uygulamanın bir İntial yükleme yapmak için bir yükleme yöntemi temin ISchemaManager uzanır. Bu veritabanı açılan aboneleri kayıt daha iyi bir alternatiftir.
Kurulumunu içeren yeni bir şema yöneticisi tanımlamak edelim:
& Nbsp; >>> gsm.unregisterUtility (sağlanan = ISchemaManager, name = 'some.app')
& Nbsp; Doğru
& Nbsp; >>> zope.generations.interfaces IInstallableSchemaManager ithal gelen
& Nbsp; >>> sınıf MySchemaManager (nesne):
& Nbsp; ... uygular (IInstallableSchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... nesil = 2
& Nbsp; ...
& Nbsp; ... def yüklemek (öz, bağlam):
& Nbsp; ... Kök = context.connection.root ()
& Nbsp; ... root ['cevaplar'] = {'Merhaba': 'Merhaba & yapmanız nasıl',
& Nbsp; ... '? Yaşamın anlamı': '42',
& Nbsp; ... 'Dört & Nbsp; ... transaction.commit ()
& Nbsp; ...
& Nbsp; ... def (öz, bağlam, nesil) gelişmeye:
& Nbsp; ... Kök = context.connection.root ()
& Nbsp; ... cevaplar = root ['cevaplar']
& Nbsp; ... eğer nesil == 1:
& Nbsp; ... soru için, answers.items içinde cevap ():
& Nbsp; ... cevaplar [Soru] = cgi.escape (cevap)
& Nbsp; ... elif nesil == 2:
& Nbsp; ... soru için, answers.items içinde cevap ():
& Nbsp; ... del cevaplar [soru]
& Nbsp; ... cevaplar [cgi.escape (soru)] = cevap
& Nbsp; ... else:
& Nbsp; ... ("serseri") ValueError yükseltmek
& Nbsp; ... root ['cevaplar'] cevapları # ping kalıcılığını =
& Nbsp; ... transaction.commit ()
& Nbsp; >>> yöneticisi = MySchemaManager ()
& Nbsp; >>> zope.component.provideUtility (yönetici, ISchemaManager, name = 'some.app')
Şimdi, yeni bir veritabanı açın sağlar:
& Nbsp; >>> db.Close ()
& Nbsp; >>> db = DB ()
& Nbsp; >>> bağl = Db.Open ()
& Nbsp; conn.root içinde >>> 'cevaplar' ()
& Nbsp; Yanlış
& Nbsp; >>> olay = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (olay)
& Nbsp; >>> conn.sync ()
& Nbsp; >>> kök = conn.root ()
& Nbsp; >>> pprint (root ['cevaplar'])
& Nbsp; {'Merhaba': 'Selam & yapmanız nasıl?',
& Nbsp; 'hayatın anlamı?' '42',
& Nbsp; 'dört & Nbsp; >>> kök [generations_key] ['some.app']
& Nbsp; 2
ZODB işlem günlüğü bizim yüklemek komut idam edildi belirtiyor
& Nbsp; >>> [. Conn.db bunun için it.description () storage.iterator ()] - [2]
& Nbsp; u'some.app: 'nesil install çalışan

Ne yeni <(Küçük bir not: MySchemaManager birini gerçekleştirir ve evolveMinimumSubscriber ikinci bir gerçekleştirir MySchemaManager gerçekten taahhüt gerekmez: İki kaydedilmesini vardır çünkü son kayıt değil..) Bu sürümde / strong>:.

  • Python 3.3 desteği eklendi

  • Eşdeğer zope.interface.implementer dekoratör ile
  • Değiştirilen önerilmeyen zope.interface.implements kullanımı.
  • Python 2.4 ve 2.5 desteği düştü.

sürüm 3.7.1 yeni nedir:

    gelişim sırasında kullanılan ancak yok oldu
  • kaldırıldı buildout parçası Windows üzerinde derleme değil.
  • Nesil komut bir işlem not eklemek.

Gereksinimler :

  • Python

Geliştirici Diğer yazılım Zope Corporation and Contributors

Yorumlar zope.generations

Yorum Bulunamadı
Yorum eklemek
Görüntülerde açın!