Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Mejorar consultas sql
#1
Hola como estan??.
estoy tratando de simplificar las consultas a una tabla en mysql para un control de stock, a modo de prueba ,el tema es al ingresar un articulo nuevo se haga una busqueda a ver si ya existe y si es asi solo se suma la cantidad a la ya existente,  todo ello hecho mediante consultas pero se me hace que muy rudimentario y demora unos segundos en cargar o actualizar cada nuevo articulo, la idea era tomar los datos nuevos y compararlos con los de la tabla pasando por un bucle y hacer el proceso de comparacion y actualizacion dentro de alguna variable para luego llevarlo a la base de datos, pero no le encontre la vuelta. Les paso el codigo, no me maten por lo cavernicoal que fui al resolverlo asi  Smile , a ver si me pueden tirar alguna idea de por donde ir... gracias saludos.


Código:
def insert(data, copia):
    conn = create_connection()
    #inserto los datos a la tabla
    sql = """INSERT INTO nombre (articulo, cantidad, talle, color, costo, ganancia, precio) VALUES(%s, %s, %s, %s, %s, %s, %s)"""
   
   
   
    try:
        cur = conn.cursor()
        cur.execute(sql, data)
        conn.commit()
        #creo una copia de la tabla
        ct = """CREATE TABLE copia_nombre LIKE nombre"""
        cur.execute(ct)
        #inserto en la nueba tabla todos los articulos manteniendo el id y sumando las cantidades de los que posean el mismo articulo, color, talle
        filtro= """INSERT INTO copia_nombre select id, articulo, sum(cantidad), talle, color, costo, ganancia, precio from nombre where articulo = %s and talle =%s and color = %s group by 'articulo' """
        cur.execute(filtro, copia)
        #borro de la tabla original los datos que coincidan en articulo, talle y color, paracopiar los datos restantes a copia_nombre
        borrar= """DELETE FROM nombre WHERE articulo = %s and talle = %s and color = %s"""
        cur.execute(borrar, copia)

        #inserto desde la tabla original los articulos no duplicados
        insertar = """INSERT INTO copia_nombre SELECT id, articulo, cantidad, talle, color, costo, ganancia, precio FROM nombre"""
        cur.execute(insertar)
        #elimino la tabla original
        drop = """DROP TABLE nombre"""
        cur.execute(drop)
        #y renombro la copia con el nobre de la tabla original
        alter= """ALTER TABLE copia_nombre RENAME TO nombre"""
        cur.execute(alter)

        conn.commit()

       

        return True
    except connector.Error as err:
        print(f"Error at insert_recuoe function: {err.msg}")
        return False
    finally:
        cur.close()
        conn.close()
Responder
#2
Hola, ¿cómo estás?

¿Es necesario crear una nueva tabla para un nuevo artículo? ¿Por qué no tener todos los artículos en una misma tabla?

Saludos
Responder
#3
(08-01-2022, 02:55 PM)Francisco escribió: Hola, ¿cómo estás?

¿Es necesario crear una nueva tabla para un nuevo artículo? ¿Por qué no tener todos los artículos en una misma tabla?

Saludos

Hola Francisco, si al principio lo tenia asi, el problema que no encontre la forma aun de que cuando agrego un articulo con color y talle  ya existente  solo sume la nueva cantidad al que ya se encuentra en la tabla en ves de duplicarlo
Responder
#4
En ese caso deberías hacer una consulta SELECT antes para saber si el artículo existe. Si existe, hacés un UPDATE; si no, hacés un INSERT. Por ejemplo, si tu tabla se llama articulos, sería algo así:

  1. cursor.execute("SELECT id, cantidad FROM articulos WHERE nombre=?", [nuevo_articulo])
  2. articulo_existente = cursor.fetchone()
  3. if articulo_existente is None:
  4. # El artículo no existe.
  5. cursor.execute("INSERT INTO articulos VALUES ...") # resto del código que ya tenés.
  6. else:
  7. # El artículo ya existe, incremento la cantidad.
  8. id_articulo, cantidad_articulo = articulo_existente
  9. cursor.execute("UPDATE articulos SET cantidad=? WHERE id=?", [cantidad_articulo + 1, id_articulo])


Saludos
Responder
#5
(15-01-2022, 10:50 PM)Francisco escribió: En ese caso deberías hacer una consulta SELECT antes para saber si el artículo existe. Si existe, hacés un UPDATE; si no, hacés un INSERT. Por ejemplo, si tu tabla se llama articulos, sería algo así:

  1. cursor.execute("SELECT id, cantidad FROM articulos WHERE nombre=?", [nuevo_articulo])
  2. articulo_existente = cursor.fetchone()
  3. if articulo_existente is None:
  4.     # El artículo no existe.
  5.     cursor.execute("INSERT INTO articulos VALUES ...")  # resto del código que ya tenés.
  6. else:
  7.     # El artículo ya existe, incremento la cantidad.
  8.     id_articulo, cantidad_articulo = articulo_existente
  9.     cursor.execute("UPDATE articulos SET cantidad=? WHERE id=?", [cantidad_articulo + 1, id_articulo])


Saludos
Hola, gracias nuevamente, tu respuesta me sirvio como punta pie para conseguir lo que queria, aca me proponias incrementar la cantidad del articulo pero yo en realidad necesitaba sumar la cantidad actual a la nueva que se habia ingresado, asi que basandome en tu respuesta  termine escribiendo el siguiente codigo y funciona a la perfeccion a parte que es mucho mas rapido que el que tenia al principio, ovbiamente acepto criticas y sugerencias...


Código:
def insert(data, copia,):
    conn = create_connection()
    #inserto los datos a la tabla
    sql = """INSERT INTO nombre (articulo, cantidad, talle, color, costo, ganancia, precio) VALUES(%s, %s, %s, %s, %s, %s, %s)"""
   
   
   
    try:
        sql_exist = """SELECT id, articulo, cantidad, talle, color, costo, ganancia, precio FROM nombre WHERE articulo = %s and talle = %s and color = %s"""
        cur = conn.cursor()
        cur.execute(sql_exist, copia)
        art_exist = cur.fetchone()

        if art_exist is None:
            cur.execute(sql, data)
        else:
            new_cant = data[1] + art_exist[2] #aca sumo la nueva cantidad a la cantidad existente
            sql_update = """UPDATE nombre SET cantidad = %s WHERE articulo = %s and talle =%s and color = %s"""
            old_product = new_cant, data[0], data[2], data[3] #creo una nueva variable con la suma de cantidades y la posicion de articulo, talle y color de la variable data  para llamarla cuando ejecute la consulta.
            cur.execute(sql_update, old_product)
       
        conn.commit()
                       

        return True
    except connector.Error as err:
        print(f"Error at insert_recuoe function: {err.msg}")
        return False
    finally:
        cur.close()
        conn.close()
Responder
#6
Perfecto Smile. Algo que también puede optimizar tu código es evitar abrir y cerrar la conexión cada vez que insertás un dato. Si en tu programa se llama varias veces a la función insert(), conviene abrir la conexión (y el cursor) al principio del código y cerrarla al final, utilizando siempre la misma conexión dentro de la función.

Saludos
Responder
#7
(18-01-2022, 02:38 PM)Francisco escribió: Perfecto Smile. Algo que también puede optimizar tu código es evitar abrir y cerrar la conexión cada vez que insertás un dato. Si en tu programa se llama varias veces a la función insert(), conviene abrir la conexión (y el cursor) al principio del código y cerrarla al final, utilizando siempre la misma conexión dentro de la función.

Saludos
GENIAL  lo tendre en cuenta para aplicarlo,  poco a poco voy aprendiendo cosas nuevas y es muy gratificante, gracias por la ayuda.
Saludos
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)