Soru Bir sqlalchemy sorgusunda literal değerleri nasıl seçerim?


Buna benzeyen bir sorgum var:

query = session.query(Item) \
    .filter(Item.company_id == company_id) \
    .order_by(Item.id)

Oldukça basit bir sorgu. Öğe değerlerini çıkarmaya ek olarak, karışıma ek bir değer eklemek istiyorum ve bana iade etmesini istiyorum. Ham SQL'de şunu yapardım:

SELECT *, 0 as subscribed
FROM items
WHERE company_id = 34
ORDER BY id

Bu değeri el ile sqlalchemy üzerinden nasıl ekleyebilirim?


25
2017-09-23 18:12


Menşei




Cevaplar:


Kullanmanız gerekecek literal_column, biraz böyle görünüyor:

sqlalchemy.orm.Query(Item, sqlalchemy.sql.expression.literal_column("0"))

Dikkat edin text argüman herhangi bir dönüşüm olmadan sorguya eklenir; Bu, metin parametresine ilişkin değerleri uygulamanızın dışından kabul ederseniz sizi bir SQL Injection güvenlik açığına maruz bırakabilir. Eğer ihtiyacınız olan bir şey varsa, kullanmak isteyeceksiniz bindparamKullanımı kolay olan yaklaşık; ama bir isim icat etmeniz gerekecek:

sqlalchemy.orm.Query(Item, sqlalchemy.sql.expression.bindparam("zero", 0))

44
2017-09-25 16:17



Wicked, bunun için teşekkürler. Ve sadece bu soruyu bir kişi bulursa, harfin adlandırılması şu şekilde yapılır: literal_column("0").label(col_name) - Gerald Thibault
Kullanarak buldum sqlalchemy.sql.expression.literal biraz daha özlü ve okunabilir bindparam dize sabitleri için. - Dologan
Bir harf dizisini seçerken, değeri tek tırnak içine koyun. Örneğin, literal_column("'my_string'") (en azından Postgres için) - zashu
sqlalchemy.sql.expression.literal diğer tipler için de işe yarayabilir, örn. bir int. Ben de mevcut olduğunu fark ettim sqlalchemy.sql.literal veya sqlalchemy.literalya da en azından 1.1.0b2 sürümünde. - timdiels
sqlalchemy import adlı kullanıcıdan literal_column - Matthew Moisen


Kabul edilen cevabın yorumlarında da belirtildiği gibi, bindparam() Bu, kelimenin tam anlamıyla bir bindparam için bir isim bulması ihtiyacını hafifletir. literal():

Bir bağlama parametresine bağlanmış bir tamsayıya dönün.

Yani yazmak zorunda değil

session.query(Item, bindparam("zero", 0).label("subscribed"))

ama sadece

session.query(Item, literal(0).label("subscribed"))

tırnak vb.


1
2017-10-31 12:27