2017-07-19 5 views
1

J'ai une table de base de données avec près de 1 million d'enregistrements. J'ai ajouté une nouvelle colonne, appelée concentration. J'ai alors une fonction qui calcule la 'concentration' pour chaque enregistrement.Mettre à jour plusieurs enregistrements postgresql en utilisant unnest

Maintenant, je veux mettre à jour les dossiers en lots, donc je cherche les questions/réponses suivantes: https://stackoverflow.com/a/33258295/596841, https://stackoverflow.com/a/23324727/596841 et https://stackoverflow.com/a/39626473/596841, mais je ne suis pas sûr de savoir comment faire en utilisant unnest ...

C'est ma fonction Python 3 pour faire les mises à jour:

def BatchUpdateWithConcentration(tablename, concentrations): 
    connection = psycopg2.connect(dbname=database_name, host=host, port=port, user=username, password=password); 
    cursor = connection.cursor(); 
    sql = """ 
    update #tablename# as t 
    set 
     t.concentration = s.con 
     FROM unnest(%s) s(con, id) 
     WHERE t.id = s.id; 
    """ 
    cursor.execute(sql.replace('#tablename#',tablename.lower()), (concentrations,)) 
    connection.commit() 
    cursor.close() 
    connection.close() 

concentrations est un tableau de tuples:

[(3.718244705238561e-16, 108264), (...)]

La première valeur est une double précision et la seconde est un entier, représentant la concentration et rowid, respectivement.

L'erreur que je reçois est:

psycopg2.ProgrammingError: a column definition list is required for functions returning "record" LINE 5: FROM unnest(ARRAY[(3.718244705238561e-16, 108264), (... ^

Répondre

1

Depuis un tuple Python est adapté par psycopg à un enregistrement anonyme Postgresql il est nécessaire de spécifier les types de données:

from unnest(%s) s(con numeric, id integer) 
+0

Aaaargh! J'avais essayé d'ajouter les types de données, mais je les ai mis accidentellement avant la variable ... – pookie