2010-11-20 12 views
13

Esiste una buona pratica per inserire i valori chiave NULL in un database PostgreSQL quando una variabile è None in Python?Come inserire valori "NULL" nel database PostgreSQL usando Python?

esecuzione di questa query:

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)) 

determina un'eccezione di un TypeError quando user_id è None.

Come è possibile inserire un NULL nel database quando un valore è None, utilizzando il driver psycopg2?

+0

quale adattatore DB-API stai usando? –

+0

tramite adattatore DB-API Suppongo che intenda l'interfaccia db psycopg2. In caso contrario, puoi essere più specifico? – xpanta

risposta

27

Per inserire i valori nulli per il database si hanno due opzioni:

  1. omettere questo campo dalla sua dichiarazione INSERT o
  2. uso None

anche: Per proteggersi da SQL-injection non dovresti usare la normale interpolazione delle stringhe per le tue domande.

Si dovrebbe passare due (2) argomenti per execute(), ad es .:

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

Alternativa # 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

Grazie. Puoi indicarmi da qualche parte così posso leggere perché l'interpolazione delle stringhe in python può portare a SQL injection. Questo è molto interessante e non ci ho pensato. – xpanta

+2

Prego. Questo descrive bene quali sono gli attacchi di SQL injection: http://en.wikipedia.org/wiki/SQL_injection In che modo questo si riferisce all'interpolazione delle stringhe ?: Supponi di ricevere input non fidati nel tuo programma. Tale input potrebbe contenere, ad esempio, un comando 'DROP TABLE'. – bernie

+0

Sto usando None per il valore della colonna ma ottengo un errore: ProgrammingError: colonna "none" inesistente LINEA 1: ... 01.00-ng20 ', report_date =' 2016-03-30 ', ec_enabled = Nessuno, ec_s ... Ecco la query originale non riuscita: UPDATE kw_daily_data_mart SET hostname = 'ctrlkey.com', users_licensed = 7, license_users = 10, sw_version = 'kw2016.01.00-ng20', report_date = '2016- 03-30 ', ec_enabled = Nessuno, ec_server_count = 1, config_max_file_version = 10, av_enabled = Vero, location_count = 1, sso_enabled = False WHERE customer_id = 127892 AND installation_id = 3585 AND hostname =' ctrlkey.com 'RESTITUZIONE id –

Problemi correlati