es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ejecución múltiple de SQL en Python utilizando insert o update

Recibí el siguiente error al ejecutar SQL en Python.

TypeError: argumentos insuficientes para la cadena de formato

Usé la función executemany para ejecutar múltiples declaraciones de SQL a la vez sin ejecutar un bucle for. Y quiero ejecutar la declaración de SQL recibiendo la lista en “idx”.

fruit_idx_list=['123','456','789']
fruit_list = [('123','manzana',70,7),('456','fresa',60,6),('789','plátano',100,10)]
sql = "MERGE INTO fruit_test " \
    + "USING DUAL " \
    + "ON idx = {idx}".format(idx = fruit_idx_list) \ #la parte sospechosa1
    + "WHEN NOT MATCHED THEN " \
    + "INSERT (idx, nombre, precio, iva) VALUES (%s, %s, %s, %s) " \
    + "WHEN MATCHED THEN " \
    + "UPDATE SET idx = %s nombre = %s, precio = %s, iva = %s; " #la parte sospechosa2

cur.executemany(sql, fruit_list) 
conn.commit()

Creo que tengo 2 partes sospechosas que podrían causar un error de SQL. Una es la parte donde se pasa fruit_idx_list y se ejecuta el SQL, y otra es la parte de la declaración de actualización. Por favor, ayúdeme a resolverlo. Gracias de antemano.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La primera parte sospechosa está en la sección “ON idx = {idx}” donde estás intentando pasar una lista a una operación de formato de cadena. No puedes pasar directamente una lista a una operación de formato de cadena. Necesitas iterar a través de la lista o usar un método diferente para convertir la lista en una cadena que pueda ser utilizada en la consulta SQL.

    La segunda parte sospechosa está en la sección “UPDATE SET” donde faltan comas entre los nombres de columna.

    Para solucionar el primer problema, puedes modificar el código de la siguiente manera:

    sql = "MERGE INTO fruit_test " \
        + "USING DUAL " \
        + "ON idx IN ({})".format(",".join(["%s"]*len(fruit_idx_list))) \
        + " WHEN NOT MATCHED THEN " \
        + "INSERT (idx, name, price, vat) VALUES (%s, %s, %s, %s)" \
        + " WHEN MATCHED THEN " \
        + "UPDATE SET idx = %s, name = %s, price = %s, vat = %s;"
    

    Aquí estamos utilizando el método join de cadenas para convertir la lista “fruit_idx_list” en una cadena separada por comas de marcadores de posición que pueden ser utilizados en la consulta SQL. También eliminamos las llaves alrededor del marcador de posición “idx”.

    Para solucionar el segundo problema, debes agregar comas entre los nombres de columna en la sección “UPDATE SET”. El código modificado debería verse así:

    sql = "MERGE INTO fruit_test " \
        + "USING DUAL " \
        + "ON idx IN ({})".format(",".join(["%s"]*len(fruit_idx_list))) \
        + " WHEN NOT MATCHED THEN " \
        + "INSERT (idx, name, price, vat) VALUES (%s, %s, %s, %s)" \
        + " WHEN MATCHED THEN " \
        + "UPDATE SET idx = %s, name = %s, price = %s, vat = %s;"
    

    Aquí, hemos agregado comas entre los nombres de columna en la sección “UPDATE SET”.

    Una vez que se realicen estos cambios, la consulta SQL debería ejecutarse sin errores.

Comments are closed.