Usar variables al formular consulta para filtrar datos de una tabla

publicado por: Anonymous

Estoy trabajando con Python y MySQL en una aplicación de Tkinter. Estoy tratando de hacer un filtro de búsqueda para que solo me muestre las entradas de mi tabla que correspondan a lo que ingreso con el teclado pero no se como establecerlo en la sentencia SQL.

La función que estoy usando para ello es:

def buscar():
    conn = MySQLdb.connect(host = "127.0.0.1", user = "root", passwd = "unitec", db = "efrias002")
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM base17 WHERE usuario = 'fduran006'")
    data = cursor.fetchall()
    for item in data:
        list1.insert(END,item)
    conn.close()

En este caso la sentencia anterior buscara en el campo “usuario” todo lo que contenga “fduran006” pero como puedo modificarlo para que busque lo que yo le indique mediante teclado. ¿Como debo modificar la parte del WHERE para lograr esto?

solución

Al parecer usas tkinter aunque no muestras como obtienes el nombre por parte del usuario en tu app. Puedes obtener el texto de una StringVar (usuario = variable.get()), de un Entry, etc.

Nunca uses el formateo de cadenas de Python (%, str.format, f"", concatenación, etc) para crear la consulta a partir de tus variables ya que te expones a ataques de inyección SQL, en su lugar haz algo así:

usuario = busqueda_text.get() 
cursor.execute("SELECT * FROM base17 WHERE usuario = %s;", (usuario,))

Dónde busqueda_text es una StringVar. El segundo argumento es un iterable, en este caso una tupla, prestar atención a la coma después de la variable, ya que de faltar los paréntesis son tratados como tales y no como indicativo de una tupla.

Hay múltiples formas seguras de pasar las variables, por ejemplo:

cursor.execute("SELECT * FROM base17 WHERE usuario = %(usr)s;", {"usr": usuario})

cursor.execute("SELECT * FROM base17 WHERE usuario = (%s);", usuario)

cursor.execute("SELECT * FROM base17 WHERE usuario = ?);", usuario)

Es decir, quedaría algo así:

def buscar():
    usuario = busqueda_text.get()
    conn = MySQLdb.connect(host = "127.0.0.1", user = "root", passwd = "unitec", db = "efrias002")
    cursor = conn.cursor() 
    cursor.execute("SELECT * FROM base17 WHERE usuario = %s;", (usuario,))

    for item in cursor:
        list1.insert(END,item)

    conn.close()
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *