2010-11-20 4 views
13

Existe-t-il une bonne pratique pour entrer des valeurs de clé NULL dans une base de données PostgreSQL lorsqu'une variable est None en Python?Comment insérer des valeurs 'NULL' dans la base de données PostgreSQL en utilisant Python?

L'exécution de cette requête:

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

résultats dans une exception TypeError quand user_id est-None.

Comment un NULL peut-il être inséré dans la base de données lorsqu'une valeur est None, en utilisant le pilote psycopg2?

+0

Quel adaptateur DB-API utilisez-vous? –

+0

par adaptateur DB-API Je suppose que vous voulez dire l'interface db psycopg2. Si non, pouvez-vous être plus précis? – xpanta

Répondre

27

Pour insérer des valeurs NULL à la base de données que vous avez deux options:

  1. ne spécifiez pas ce champ de votre instruction INSERT ou
  2. utilisation None

aussi: Pour se prémunir contre SQL injection vous ne devez pas utiliser l'interpolation de chaîne normale pour vos requêtes.

Vous devez passer deux (2) arguments à execute(), .: par exemple

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

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

Merci. Pouvez-vous me pointer quelque part afin que je puisse lire pourquoi l'interpolation de chaîne en python peut mener à l'injection sql. C'est très intéressant et je n'y ai pas pensé. – xpanta

+2

De rien. Cela décrit bien les attaques par injection SQL: http://en.wikipedia.org/wiki/SQL_injection Comment cela se rapporte-t-il à l'interpolation de chaîne?: Dites que vous recevez une entrée non fiable dans votre programme. Cette entrée pourrait contenir, par exemple, une commande 'DROP TABLE'. – bernie

+0

J'utilise None pour la valeur de la colonne mais je reçois une erreur: ProgrammingError: la colonne "none" n'existe pas LINE 1: ... 01.00-ng20 ', report_date =' 2016-03-30 ', ec_enabled = Aucun, ec_s ... Voici la requête d'origine qui échoue: MISE À JOUR kw_daily_data_mart SET hostname = 'ctrlkey.com', users_licensed = 7, authorized_users = 10, sw_version = 'kw2016.01.00-ng20', report_date = '2016- 03-30 ', ec_enabled = Aucun, ec_server_count = 1, config_max_file_version = 10, av_enabled = Vrai, location_count = 1, sso_enabled = Faux WHERE client_id = 127892 ET installation_id = 3585 AND hostname =' ctrlkey.com 'ID RETOUR –

Questions connexes