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.