Estoy intentando recuperar datos asociados con un apellido en particular. Sin embargo, este apellido se almacena dentro de un cuadro de lista junto con un nombre y una coma separadora. Como tal, el nombre se recupera del cuadro de lista primero mediante la selección del cursor, y solo se usa el apellido para buscar dividiendo el resto:

lastname, sep, firstname = (self.patient_list.get(self.patient_list.curselection())).partition(',') 

Una vez hecho esto, estoy tratando de obtener una impresión de las filas de datos para este apellido elegido. Sin embargo, me encuentro con el problema:

TypeError: argument 1 must be a string or unicode object: got tuple instead

Me pregunto cómo proceder con este problema. He intentado algunas soluciones, como la función tuple dentro del argumento en load_query, así como str en lastname, pero es una cadena ...

También me pregunto si es necesario seleccionar de una base de datos de PostgreSQL mediante este método. ¿Puedo intentar vincular un elemento de cuadro de lista a una fila de datos en la base de datos? O evite dividir el elemento, ya que eso parece ser un problema quizás ...

Código completo:

        def load_profile(self, event):
            conn = pg.connect(user='postgres',
                                    password='123!',
                                    host='localhost',
                                    port='5430',
                                    database='carepartnerdb')
            
            cur = conn.cursor()
    
            #gets lastname from listbox, removes all else past the comma
            #used to associate to DB 
            lastname, sep, firstname = (self.patient_list.get(self.patient_list.curselection())).partition(',')
    
            load_query = (""" SELECT * FROM profiles_table WHERE patient_lastname=%s """, lastname) 
            cur.execute(load_query)
            conn.commit()
    
            #data = cur.fetchall()
            #print(data) 
    
            cur.close()
            conn.close()
1
Fysics 1 sep. 2020 a las 00:46

1 respuesta

La mejor respuesta

load_query es un tuple, por lo que cur.execute(load_query) generará la excepción ya que execute() espera una cadena (la cadena de consulta) como primer argumento.

Debes cambiar:

load_query = (""" SELECT * FROM profiles_table WHERE patient_lastname=%s """, lastname) 
cur.execute(load_query)

Para:

load_query = "SELECT * FROM profiles_table WHERE patient_lastname = %s" 
cur.execute(load_query, (lastname,))

Además, la declaración SELECT no requiere commit().

1
acw1668 1 sep. 2020 a las 00:57