2010-11-20 127 views
13

當Python中的變量爲None時,是否有將NULL鍵值輸入到PostgreSQL數據庫的良好做法?如何使用Python將'NULL'值插入PostgreSQL數據庫?

運行此查詢:

mycursor.execute('INSERT INTO products (user_id, city_id, product_id, quantity, price) VALUES (%i, %i, %i, %i, %f)' %(user_id, city_id, product_id, quantity, price)) 

導致一個TypeError異常,當user_idNone

當值爲None時,如何使用psycopg2驅動程序將NULL插入到數據庫中?

+0

哪個DB-API適配器您使用?由DB-API適配器編寫的 – 2010-11-20 06:23:58

+0

我想你的意思是db接口psycopg2。如果不是,你可以更具體嗎? – xpanta 2010-11-20 06:34:18

回答

27

要插入到數據庫空值,你有兩個選擇:

  1. 省略從INSERT語句中那場,或
  2. 使用None

另外:爲了防止SQL注入你不應該爲你的查詢使用普通的字符串插值。

你應該通過兩(2)參數​​,例如:

mycursor.execute("""INSERT INTO products 
        (city_id, product_id, quantity, price) 
        VALUES (%s, %s, %s, %s)""", 
       (city_id, product_id, quantity, price)) 

替代#2:

user_id = None 
mycursor.execute("""INSERT INTO products 
        (user_id, city_id, product_id, quantity, price) 
        VALUES (%s, %s, %s, %s, %s)""", 
       (user_id, city_id, product_id, quantity, price)) 
+0

謝謝。你能指點我什麼地方,所以我可以閱讀爲什麼在Python中的字符串插值可能會導致SQL注入。這非常有趣,我沒有想到這一點。 – xpanta 2010-11-20 07:17:49

+2

不客氣。這很好地描述了SQL注入攻擊是什麼:http://en.wikipedia.org/wiki/SQL_injection這與字符串插值有什麼關係?假設你接收到不可信任的輸入到你的程序。該輸入可以包含例如「DROP TABLE」命令。 – bernie 2010-11-20 07:29:03

+0

我使用None作爲列值,但得到一個錯誤: ProgrammingError:column「none」does not exist LINE 1:... 01.00-ng20',report_date ='2016-03-30',ec_enabled =無,ec_s ... 以下是原始查詢失敗: UPDATE kw_daily_data_mart SET hostname ='ctrlkey.com',users_licensed = 7,licensed_users = 10,sw_version ='kw2016.01.00-ng20',report_date ='2016- 03-30',ec_enabled =無,ec_server_count = 1,config_max_file_version = 10,av_enabled = True,location_count = 1,sso_enabled = False where customer_id = 127892 AND installation_id = 3585 AND hostname ='ctrlkey.com'RETURNING id – 2016-03-30 18:29:16

相關問題