簡體   English   中英

如何在 psycopg 中使用 SELECT 查詢查找空值?

[英]How can I find null values with SELECT query in psycopg?

我在 python 中使用 psycopg2 庫,當我用 None 插入空值時, INSERT查詢效果很好,但是當我想執行SELECT空值時,用 None 不返回任何值。

cur.execute("SELECT id FROM registro WHERE id_movil = (%s);", (None,))

此查詢不返回任何行,我不知道錯誤在哪里。

任何人都知道如何進行SELECT查詢以在數據庫中查找空值?

首先要做的是找出它將您的命令轉換為什么查詢:

print(cur.mogrify("SELECT id FROM registro WHERE id_movil = (%s);", (None,)))

如果這給您除IS NULL檢查之外的任何其他內容,則它不會從表中獲取 NULL。

具體來說,如果您看到短語= NULL ,您就會知道它沒有被正確翻譯(1) ,您必須執行以下操作:

if var is None:
    cur.execute("SELECT id FROM registro WHERE id_movil IS NULL;")
else:
    cur.execute("SELECT id FROM registro WHERE id_movil = (%s);", (var,))

或者,如果您知道您一直在尋找NULL值(正如您使用的常量None似乎表明的那樣),只需使用:

cur.execute("SELECT id FROM registro WHERE id_movil IS NULL;")

(1)當參數為None ,很有可能只有%s被替換為NULL ,並且返回並將=更改為IS (或<>更改為IS NOT )不夠聰明。

這將解釋為什么這樣做:

cur.execute("INSERT into mytbl value (%s);", (None,))

(因為替換%s會給出您想要的命令),但是任何帶有= NULL東西都不會按預期運行,除非您已經被它燒毀了足夠多的時間以知道會發生什么:-)。

嘗試這個

cur.execute("SELECT id FROM registro WHERE (id_movil = (%s) or id_movil is null);", (movil,))

檢查某些內容是否為NULL值有不同的語法:

cur.execute("SELECT id FROM registro WHERE id_movil IS NULL;")

這同樣適用於獲取非NULL所有內容:

cur.execute("SELECT id FROM registro WHERE id_movil IS NOT NULL;")

編輯

您可以像往常一樣使用 AND 組合 WHERE 子句:

cur.execute(
    "SELECT id FROM registro WHERE id_movil IS NULL AND name = (%s);",
    ('Bob',)
)

我目前正在試驗的另一種方法是 postgres 設置,稱為transform_null_equals ( https://www.postgresql.org/docs/13/runtime-config-compatible.html#GUC-TRANSFORM-NULL-EQUALS )

你可以在postgresql.conf設置它,或者你做你的配置(我使用 docker-compose for local dev 和 RDS for prod,所以這意味着一個參數組)。

transform_null_equals = 1

結果是 postgres 只是神奇地將 any = NULL查詢轉換為IS NULL而您無需考慮它! 🎉

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM