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), (... ^
Aaaargh! J'avais essayé d'ajouter les types de données, mais je les ai mis accidentellement avant la variable ... – pookie