2010-02-25 25 views
21

'daki sayacı nasıl artırırım Farz edelim count numaralı alana sahip count numaralı bir tabloya sahip olan tablo items belirtilen etiketle etiketlendi.SQLAlchemy

Varolan bir etiketle yeni bir öğe ekledikten sonra bu sayacı SQLAlchemy'de nasıl artırabilirim? Aşağıdaki yapacağını düz SQL ile

:

INSERT INTO `items` VALUES (...) 
UPDATE `tags` SET count=count+1 WHERE tag_id=5 

Ama nasıl sqlalchemy içinde count=count+1 ifade edersiniz?

Teşekkürler, Boda Cydo.

cevap

34

gibi bir şey varsa: Böyle alanları artırmak olabilir

mytable = Table('mytable', db.metadata, 
    Column('id', db.Integer, primary_key=True), 
    Column('counter', db.Integer) 
) 

: Bazı eşlenen Modelleri varsa

m = mytable.query.first() 
m.counter = mytable.c.counter + 1 

Ya da, alternatif olarak yazabilirsiniz:

m = Model.query.first() 
m.counter = Model.counter + 1 

Her iki sürüm de sorduğunuz sql deyimini döndürür. Ancak sütunu eklemezseniz ve sadece m.counter += 1 yazarsanız, yeni değer Python'da hesaplanır (ve yarış koşullarının gerçekleşmesi muhtemeldir). Bu nedenle, her zaman yukarıdaki iki örnekte gösterildiği gibi bir sayaç gibi sorguları ekleyin.

Selamlar,
Christoph

+2

Teşekkürler. Fakat yarış durumu hakkında daha fazla bilgi verir misiniz? İlk versiyonun ikinci saniyeden daha güvenli olacağını doğru mu anladım? – bodacydo

+1

Hayır. Size gösterdiğim iki sürümde tamamen aynıdır (bir tanesi eşlenmiş nesneleri ve diğer tabloları kullanır). Ancak, + = 'ile olan üçüncü ifade,' SET counter = counter + 1' yerine SET counter = 4' ile sonuçlanır. Yani üçüncü '+ =' sürümünü kullanmamalısınız. – tux21b

+0

Anlaşıldı. Yardım için teşekkürler! – bodacydo

19

o zaman güncelleme açıklamada keyfi SQL ifadeleri kullanabilirsiniz SQL katmanını kullanıyorsanız:

conn.execute(tags.update(tags.c.tag_id == 5).values(count=tags.c.count + 1)) 

ORM Sorgu nesnesi de bir güncelleme yöntemi vardır:

ORM sürümü, nesnedeki sayım özelliğini de güncelleyecek kadar akıllıdır. eğer oturumda ise.