sqlalchemy ไม่ได้เลือกเป็นโมฆะ


111

ฉันจะเพิ่มตัวกรองใน SQL เพื่อเลือกค่าที่ไม่เป็นโมฆะจากคอลัมน์ใดคอลัมน์หนึ่งได้อย่างไร

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

ฉันจะทำเช่นเดียวกันกับตัวกรอง SQLAlchemy ได้อย่างไร

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

ที่all_filtersนี่คืออะไร? ทำไมselect_from?
Martijn Pieters

คุณมีนิยามตารางหรือไม่หรือต้องใช้ตัวอักษรคอลัมน์?
Martijn Pieters

คำตอบ:


149

column_obj != Noneจะสร้างIS NOT NULLข้อ จำกัด :

a != bในบริบทคอลัมน์ผลิตประโยค หากเป้าหมายคือNoneสร้างไฟล์IS NOT NULL.

หรือใช้isnot()(ใหม่ใน 0.7.9):

ใช้ตัวIS NOTดำเนินการ

โดยปกติIS NOTจะถูกสร้างขึ้นโดยอัตโนมัติเมื่อเทียบกับค่าของที่หายไปNone NULLอย่างไรก็ตามการใช้งานอย่างชัดเจนIS NOTอาจเป็นที่พึงปรารถนาหากเปรียบเทียบกับค่าบูลีนในบางแพลตฟอร์ม

การสาธิต:

>>> 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
"ไม่ใช่ไม่มี" ให้ผลลัพธ์เดียวกันหรือไม่
Breezer

24
@Breezer: ไม่เพราะisไม่สามารถโอเวอร์โหลดโดยคลาสที่กำหนดเอง!=ได้
Martijn Pieters

3
คำตอบอื่นคือคำตอบที่ต้องการในขณะนี้ นอกจากนี้ยังหลีกเลี่ยง IDE จำนวนมากรวมถึง PyCharm จากการสร้างคำเตือน
Antti Haapala

@AnttiHaapala: ฉันไม่แน่ใจว่ามันเป็น 'ที่ต้องการ' เอกสาร SQLAlchemy อ้างถึงบูลีนเป็น usecase ที่สำคัญกว่า ฉันได้เพิ่มตัวเลือกนั้นแล้ว
Martijn Pieters

110

เริ่มตั้งแต่เวอร์ชัน 0.7.9 คุณสามารถใช้ตัวดำเนินการกรอง.isnotแทนการเปรียบเทียบข้อ จำกัด เช่นนี้:

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

วิธีนี้จำเป็นเฉพาะในกรณีที่มีปัญหาเกี่ยวกับ pep8

ที่มา: เอกสาร sqlalchemy


5
นอกเหนือจากการทำให้ pep8 มีความสุขแล้วฉันคิดว่านี่เป็นทางออกที่ดีกว่าเพราะNULLไม่ถูกต้องตาม RHS ของ!=SQL และการใช้คำสั่งที่isnotดีกว่าจะบ่งบอกถึงความตั้งใจของคุณสำหรับสิ่งที่คุณต้องการให้คำสั่งที่สร้างขึ้นมีลักษณะเช่นนี้
Josh

2
@ Josh: SQLAlchemy จะไม่ปล่อยออกมา!= NULLแม้ว่าคุณจะใช้column != Noneทางด้าน Python ก็ตาม IS NOT NULLคุณจะได้รับ อย่างไรก็ตามการใช้.isnot()ช่วยให้คุณบังคับใช้ IS NOTประเภทอื่น ๆ ได้ (เช่นคิด.isnot(True)เทียบกับคอลัมน์บูลีน)
Martijn Pieters

49

ในกรณีที่มีใครสงสัยคุณสามารถใช้is_เพื่อสร้างfoo IS NULL:

>>> จากคอลัมน์นำเข้า sqlalchemy.sql
>>> คอลัมน์การพิมพ์ ('foo') is_ (ไม่มี)
foo เป็นโมฆะ
>>> คอลัมน์การพิมพ์ ('foo') ไม่ใช่ (ไม่มี)
foo ไม่ใช่โมฆะ

4
ขอบคุณนี่คือสิ่งที่ฉันกำลังมองหา แต่ Google ส่งฉันมาที่นี่!
Sinister Beard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.