Comment insérer des valeurs NULL « » dans la base de données PostgreSQL en utilisant Python?
-
26-09-2019 - |
Question
Y at-il une bonne pratique pour la saisie des valeurs clés de NULL
à une base de données PostgreSQL lorsqu'une variable est None
en 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))
aboutit à une une exception TypeError
lorsque user_id
est None
.
Comment un NULL
être inséré dans la base de données lorsqu'une valeur est None
, en utilisant le pilote psycopg2
?
La solution
Pour insérer des valeurs NULL à la base de données que vous avez deux options:
- omettent ce champ de votre instruction INSERT ou
- utilisation
None
De plus. Pour se prémunir contre l'injection SQL, vous ne devriez pas utiliser l'interpolation de chaîne normale pour vos requêtes
arguments Vous devez passer deux (2) à 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))
Variante 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))
Autres conseils
Avec la psycopg actuelle, au lieu de None, utilisez un ensemble variable '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)
Une approche plus simple qui est aussi pratique avec un nombre élevé de colonnes:
Soit row
une liste de valeurs à insérer qui peuvent contenir None
. Pour l'insérer dans PostgreSQL nous procédez comme suit
values = ','.join(["'" + str(i) + "'" if i else 'NULL' for i in row])
cursor.execute('insert into myTable VALUES ({});'.format(values))
conn.commit()