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) 
salamey
sumber
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'
Martijn Pieters
sumber
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

Filipe Spindola
sumber
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
Matthew Moisen
sumber
2
Terima kasih, ini yang saya cari, tetapi Google mengirim saya ke sini!
Sinister Beard