60 votes

Comment insérer des valeurs 'NULL' dans une base de données PostgreSQL en utilisant Python ?

Existe-t-il une bonne pratique pour saisir NULL vers une base de données PostgreSQL lorsqu'une variable est None en Python ?

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

donne lieu à une TypeError exception lorsque user_id es None .

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

73voto

bernie Points 44206

Pour insérer des valeurs nulles dans la base de données, vous avez deux possibilités :

  1. omettre ce champ dans votre instruction INSERT, ou
  2. utiliser None

Aussi : Pour vous protéger contre l'injection SQL, vous ne devez pas utiliser l'interpolation normale des chaînes de caractères 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 n°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))

9voto

wolf2600 Points 459

Avec le psycopg actuel, au lieu de None, on utilise une variable définie comme 'NULL'.

variable = 'NULL'
insert_query = """insert into my_table values(date'{}',{},{})"""
format_query = insert_query.format('9999-12-31', variable, variable)
curr.execute(format_query)
conn.commit()

>> insert into my_table values(date'9999-12-31',NULL,NULL)

3voto

Randy Points 53

Voici ma solution :

text = '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))

text = text.replace("nan", "null")

mycursor.execute(text)

0voto

LoMaPh Points 287

Une approche plus simple qui est également pratique avec un nombre élevé de colonnes :

Soit row être une liste de valeurs à insérer qui peut contenir None . Pour l'insérer dans PostgreSQL nous faisons comme suit

values = ','.join(["'" + str(i) + "'" if i else 'NULL' for i in row])
cursor.execute('insert into myTable VALUES ({});'.format(values))
conn.commit()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X