Usando SELECT y VALUES juntos en una declaración INSERT
Tengo una consulta como parte de un código Python en la que la consulta requiere hacer uso de variables en el programa, así como valores de otra base de datos. Estoy utilizando mysql-connector-python.
Los valores de name
están presentes en el programa Python y quiero usar eso y los valores de la tabla metrics
para insertar valores en la tabla points
.
Esto es lo que he intentado hasta ahora:
class summer:
def __init__(self, name):
self.name = name
def sum_fun(self, name):
try:
con = mysql.connector.connect(host='localhost',
database='databasename',
user='root',
password='mypasword',
charset='utf8')
if con.is_connected():
cursor = con.cursor(buffered=True)
def create_points_table():
query=("INSERT INTO points(username, sale,comm,dank) VALUES (%s, (SELECT SUM(regional + intnl) * 150, SUM(commission) * 50, SUM(thank_discount) * 10 FROM Metrics))")
cursor.execute(query, (name))
con.commit()
create_points_table();
except Error as e:
print(e)
cursor.close()
con.close()
La consulta:
query=("INSERT INTO points(username, sale,comm,dank)
VALUES (%s,
(SELECT
SUM(regional + intnl) * 150,
SUM(commission) * 50,
SUM(thank_discount) * 10 FROM Metrics))")
Llamada a la consulta:
cursor.execute(query, (name))
Ninguno de los valores se está insertando en la tabla “points”. ¿Qué estoy haciendo mal aquí?
davy.ai
Es importante verificar errores al trabajar con consultas SQL, especialmente con las inserciones. Un problema potencial en este código es que la sección
VALUES
de la consulta está tratando de insertar tres valores separados, pero la funcióncursor.execute
solo pasa un valor para(name)
.Para solucionar esto, podemos modificar la consulta y la función
cursor.execute
para incluir todas las variables necesarias:En esta consulta modificada,
username
recibe el valor de(name)
que se pasa a través de la función, y los valores restantes se calculan mediante la declaraciónSELECT
utilizando datos de la tablaMetrics
.También es importante tener en cuenta que debemos incluir una coma después de
(name)
en la funcióncursor.execute
para asegurarnos de que se pase como una tupla, como lo requiere la función.Además, es una buena práctica envolver las declaraciones SQL entre comillas triples para evitar problemas con caracteres especiales.
Con estos cambios, la función debería poder insertar los valores necesarios en la tabla
points
.