sqlalchemy NULL DEĞİLDİR seçin


110

Belirli bir sütundan NULL olmayan değerleri seçmek için filtreyi SQL'deki gibi nasıl ekleyebilirim?

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Aynısını SQLAlchemy filtreleri ile nasıl yapabilirim?

select = select(table).select_from(table).where(all_filters) 

all_filtersBurada ne var? Neden select_from?
Martijn Pieters

Ve bir tablo tanımınız var mı yoksa sütun değişmezlerini kullanmanız mı gerekiyor?
Martijn Pieters

Yanıtlar:


147

column_obj != Nonebir IS NOT NULLkısıtlama üretecek :

Bir sütun bağlamında, cümleciği üretir a != b. Hedef ise None, bir IS NOT NULL.

veya kullanın isnot()(0.7.9'da yeni):

Uygulamak IS NOToperatörü.

Normalde, IS NOTbir değeri ile karşılaştırılırken otomatik olarak oluşturulur None, hangi değerine çözümlenir NULL. Bununla birlikte, IS NOTbelirli platformlarda boole değerleriyle karşılaştırılırsa , açık bir şekilde kullanılması istenebilir.

Demo:

>>> from sqlalchemy.sql import column
>>> column('YourColumn') != None
<sqlalchemy.sql.elements.BinaryExpression object at 0x10c8d8b90>
>>> str(column('YourColumn') != None)
'"YourColumn" IS NOT NULL'
>>> column('YourColumn').isnot(None)
<sqlalchemy.sql.elements.BinaryExpression object at 0x104603850>
>>> str(column('YourColumn').isnot(None))
'"YourColumn" IS NOT NULL'

9
"Hiçbiri değil" aynı çıktıyı üretir mi?
Breezer

24
@Breezer: hayır, çünkü isözel sınıflar tarafından aşırı !=yüklenemez.
Martijn Pieters

3
Diğer cevap şimdi tercih edilen cevaptır; ayrıca PyCharm dahil birçok IDE'nin uyarı üretmesini engeller.
Antti Haapala

@AnttiHaapala: "Tercih edilen" olup olmadığından emin değilim. SQLAlchemy dokümantasyonu boole'ları daha önemli bir kullanım alanı olarak gösterir. Bu seçeneği ekledim.
Martijn Pieters

110

0.7.9 sürümünden başlayarak .isnot, aşağıdaki gibi kısıtlamaları karşılaştırmak yerine filtre operatörünü kullanabilirsiniz :

query.filter(User.name.isnot(None))

Bu yöntem sadece pep8 bir endişe ise gereklidir.

kaynak: sqlalchemy dokümantasyonu


5
Pep8'i mutlu etmenin ötesinde, bunun daha iyi bir çözüm olduğunu düşünüyorum çünkü SQL'de NULLRHS kadar geçerli değil !=ve isnotdaha iyi kullanmak , oluşturulan ifadenin neye benzemesini istediğinizi daha iyi iletiyor.
Josh

2
@Josh: SQLAlchemy Python tarafında != NULLkullansanız bile yaymaz column != None; sen alırsın IS NOT NULL. Kullanmak , ancak diğer türleri zorlamanıza.isnot() izin verir ( örneğin, boole sütunlarına karşı düşünün ). IS NOT.isnot(True)
Martijn Pieters

47

Başka birinin merak is_etmesi durumunda, aşağıdakileri oluşturmak için kullanabilirsiniz foo IS NULL:

>>> sqlalchemy.sql içe aktarma sütunundan
>>> baskı sütunu ('foo'). is_ (Yok)
foo NULL IS
>>> baskı sütunu ('foo'). değil (Yok)
foo BOŞ DEĞİL

3
Teşekkürler, aradığım buydu ama Google beni buraya gönderdi!
Uğursuz Sakal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.