![](/img/trans.png)
[英]How can I update rows obtained by a SELECT query in PostgreSQL with Python? Python 2.7 psycopg2
[英]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.