2009-10-26 26 views
5

SA-eşlemeli nesnesinin sığ bir kopyasını otomatik olarak oluşturmaya çalışıyorum .. Şu an işlevim sadece:SQLAlchemy: Tembel yükleme kaçınarak sığ kopya

newobj = src.__class__() 
for prop in class_mapper(src.__class__).iterate_properties: 
    setattr(newobj, prop.key, getattr(src, prop.key)) 

fakat tembel ilişkilerle ilgili sorun yaşıyorum ... Açıkçası getattr tembel yüklemeyi tetikler, ama değerlerini doğru 'a ihtiyaç duymadığımdan, sadece "bu tembel yüklü" 'in -state özniteliğini kopyalamak isterim ... Bu mümkün mü?

Düzenleme: Bir "veri kaydı" sistemi için buna ihtiyacım var .. Birisi kalıcı bir varlığı güncellediğinde, yeni bir kayıt oluşturmalı ve sonra eski olanı işaretlemeliyim.
Bunu yapmak için nesnenin sığ bir kopyasını yaratıyorum (bu yüzden SQLA bir UPDATE yerine INSERT verir) ve oradan çalışın .. Sistem oldukça güzel çalışıyor (aylarca üretimde kullanılıyor) ama şimdi Bunu geliştirmek istedim, böylece tüm ilişkilerin önce tembel yüklü olması gerekmeyecek ..

+0

Günlüğü değiştiriliyor mu? Tüm tarihi devletlerin tarihini koruyan versiyon sistemi gibi görünüyor. –

+0

Tam olarak, "class_mapper (src .__ class __)", do 'object_mapper (src)' yerine – Joril

+1

öğesinin tüm sürümlerini saklar. Doğrudan '__foo__' özelliklerine erişmekten kaçının. – nosklo

cevap

6

Sadece ihtiyacınız olan sütun özelliklerini kopyalamak için ihtiyacınız olan, isinstance(prop, sqlalchemy.orm.ColumnProperty) kullanarak kolayca filtrelenebilir. Ana tabloda bunlara karşılık gelen bir sütun bulunmadığından, harici olarak saklanan ilişkileri (çoktan çoğa) kopyalamanız gerektiğine dikkat edin. Bu, tembel yükleme olmadan yüksek seviyeli arayüzle yapılamaz, bu yüzden bu ticareti kabul etmeyi tercih ederim. Çoktan çoğa ilişkiler isinstance(prop, RelationProperty) and prop.secondary testi ile belirlenebilir.

Ayrıca
from sqlalchemy.orm import object_mapper, ColumnProperty, RelationProperty 

newobj = type(src)() 
for prop in object_mapper(src).iterate_properties: 
    if (isinstance(prop, ColumnProperty) or 
     isinstance(prop, RelationProperty) and prop.secondary): 
    setattr(newobj, prop.key, getattr(src, prop.key)) 

SQLAlchemy, her kimlik için yüklenen tek nesne korumak için tasarlandığını unutmayın ederken kopya sonları bu kimlik (birincil anahtar) özellikleri de kopyalandığında ama bu: Ortaya çıkan kod aşağıdaki gibi görünecektir Yeni (sürümlü) tanımlayıcı ile depolanıyorsanız muhtemelen sizin durumunuz değildir.

+0

Soruyu değiştirerek tamam .. :) – Joril

İlgili konular