sqlalchemy IS NOT NULL pilih


108

Bagaimana cara menambahkan filter seperti pada SQL untuk memilih nilai yang BUKAN NULL dari kolom tertentu?

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Bagaimana saya bisa melakukan hal yang sama dengan filter SQLAlchemy?

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

Ada apa all_filtersdisini? Mengapa select_from?
Martijn Pieters

Dan apakah Anda memiliki definisi tabel atau apakah Anda perlu menggunakan literal kolom?
Martijn Pieters

Jawaban:


144

column_obj != Noneakan menghasilkan IS NOT NULLkendala :

Dalam konteks kolom, menghasilkan klausa a != b. Jika targetnya adalah None, menghasilkan a IS NOT NULL.

atau gunakan isnot()(baru di 0.7.9):

Terapkan IS NOToperator.

Biasanya, IS NOTdihasilkan secara otomatis saat membandingkan dengan nilai None, yang memutuskan NULL. Namun, penggunaan eksplisit IS NOTmungkin diinginkan jika dibandingkan dengan nilai boolean pada platform tertentu.

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
Apakah "is not None" menghasilkan keluaran yang sama?
Breezer

23
@Breezer: tidak, karena istidak dapat dibebani oleh kelas khusus !=.
Martijn Pieters

3
Jawaban lainnya adalah jawaban yang disukai sekarang; itu juga menghindari banyak IDE termasuk PyCharm dari menghasilkan peringatan.
Antti Haapala

@AnttiHaapala: Saya tidak yakin apakah itu 'disukai'. Dokumentasi SQLAlchemy mengutip boolean sebagai kasus penggunaan yang lebih penting. Saya telah menambahkan opsi itu.
Martijn Pieters

107

Mulai versi 0.7.9 Anda dapat menggunakan operator filter .isnotdaripada membandingkan batasan, seperti ini:

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

Metode ini hanya diperlukan jika pep8 menjadi perhatian.

sumber: dokumentasi sqlalchemy


5
Selain membuat pep8 senang, saya pikir ini adalah solusi yang lebih baik karena NULLtidak valid seperti RHS !=dalam SQL dan menggunakan isnotlebih baik menyampaikan niat Anda untuk apa yang Anda inginkan dari pernyataan yang dihasilkan.
Josh

2
@Josh: SQLAlchemy tidak akan memancarkan != NULL, meskipun Anda menggunakan column != Nonesisi Python; kamu mendapatkan IS NOT NULL. Namun, menggunakan .isnot()memungkinkan Anda memaksakan IS NOT tipe lain (pikirkan .isnot(True)tentang kolom boolean, misalnya).
Martijn Pieters

47

Jika ada orang lain yang bertanya-tanya, Anda dapat menggunakan is_untuk menghasilkan foo IS NULL:

>>> dari kolom impor sqlalchemy.sql
>>> kolom cetak ('foo'). is_ (Tidak Ada)
foo IS NULL
>>> kolom cetak ('foo'). isnot (None)
foo BUKAN NULL

2
Terima kasih, ini yang saya cari, tetapi Google mengirim saya ke sini!
Sinister Beard
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.