Domanda

C'è una buona pratica per l'immissione di valori chiave NULL a un database PostgreSQL, quando una variabile è None in Python?

L'esecuzione di questo 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))

si traduce in un'un'eccezione TypeError quando user_id è None.

Come può un NULL essere inserito nel database quando un valore è None, utilizzando il driver psycopg2?

È stato utile?

Soluzione

Per inserire valori nulli al database si hanno due opzioni:

  1. omettere quel campo dal INSERT, o
  2. uso None

Inoltre:. Per evitare il rischio di SQL-injection non si dovrebbe usare normale interpolazione stringa per le vostre domande

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

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

Altri suggerimenti

Con l'psycopg corrente, invece di None, utilizzare un set variabile '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)

Un approccio più semplice, che è anche pratico con elevato numero di colonne:

Sia row essere un elenco di valori da inserire che può contenere None. Per inserire in PostgreSQL che facciamo nel modo seguente

values = ','.join(["'" + str(i) + "'" if i else 'NULL' for i in row])
cursor.execute('insert into myTable VALUES ({});'.format(values))
conn.commit()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top