Foros del Web » Programando para Internet » Python »

Porque fetchone no me hace lo que quiero

Estas en el tema de Porque fetchone no me hace lo que quiero en el foro de Python en Foros del Web. TENGO ESTA FUNCION Y ME PASA DE UN REGISTRO A OTRO PERO CUANDO VUALVO A EJECUTAR LA FUNCION NO ME MUESTRA EL SEGUNDO REGISTRO PROXIMO. ...
  #1 (permalink)  
Antiguo 27/06/2011, 22:18
 
Fecha de Ingreso: diciembre-2010
Mensajes: 162
Antigüedad: 13 años, 11 meses
Puntos: 1
Porque fetchone no me hace lo que quiero

TENGO ESTA FUNCION Y ME PASA DE UN REGISTRO A OTRO PERO CUANDO VUALVO A EJECUTAR LA FUNCION NO ME MUESTRA EL SEGUNDO REGISTRO PROXIMO. LES AGRADECERIA UNA AYUITA. QUIERO QUE ME PASE DE UN REGISTRO A OTRO Y DESPUES AL OTRO ETC

def onsiguiente(self,event):
conexion=sqlite3.connect("MOTOS.S3DB")
cursor=conexion.cursor()
cursor.execute("SELECT CODIGO,PRECIO,DETALLE FROM MOTOS")
cursor.fetchone()
for row in cursor:
self.textocodigo.SetValue(row[2])
self.textocodigo2.SetValue(row[0])
self.textocodigo3.SetValue(row[1])

cursor.close()
conexion.close()
  #2 (permalink)  
Antiguo 28/06/2011, 10:56
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Porque fetchone no me hace lo que quiero

Estás usando mal la función, ya que de esa forma siempre estás obteniendo el primer registro (ya que siempre estás ejecutando la consulta)

No sé cuál será tu necesidad de usar una función para obtener cada registro, pero por un lado podés usar LIMIT (aunque es de MySQL, no sé si en SQLite se puede hacer igual) y por otro quizás te sirva usar yield.

Aunque mi pregunta real es: ¿por qué tu aplicación requiere que traigas un registro cada vez? Creo que tu forma de atacar el problema no es correcta.


Saludos.
  #3 (permalink)  
Antiguo 28/06/2011, 13:27
 
Fecha de Ingreso: diciembre-2010
Mensajes: 162
Antigüedad: 13 años, 11 meses
Puntos: 1
De acuerdo Respuesta: Porque fetchone no me hace lo que quiero

mi idea es hacer un programa contable que busque registros escibiendolos en un textctrl y pulsando el boton me salga en otro texctrl mercaderia precio etc eso lo logre ya con sqlite y sqliteadmin, pero he visto algunos programas que dan la posibilidad de navegar registros sin tener que escribirlo, por eso mi pregunta y espero entiendas lo que quiero hacer.gracias por la respuesta
  #4 (permalink)  
Antiguo 28/06/2011, 14:29
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Porque fetchone no me hace lo que quiero

Comprendo, pero el problema es que al hacer la consulta en cada ejecución de la función, siempre estás accediendo al primer registro. Deberías hacer la consulta primero, y luego iterar sobre el cursor. Una forma podría ser:

Código Python:
Ver original
  1. def consulta(self):
  2.     conexion=sqlite3.connect("MOTOS.S3DB")
  3.     self.cursor=conexion.cursor()
  4.     self.cursor.execute("SELECT CODIGO,PRECIO,DETALLE FROM MOTOS")
  5.  
  6. def onsiguiente(self,event, cursor):
  7.     row = self.cursor.fetchone()
  8.     self.textocodigo.SetValue(row[2])
  9.     self.textocodigo2.SetValue(row[0])
  10.     self.textocodigo3.SetValue(row[1])

Otra forma mejor es aprovechar las capacidades de SQLite:

Código Python:
Ver original
  1. def onsiguiente(self,event, offset):
  2.     conexion=sqlite3.connect("MOTOS.S3DB")
  3.     cursor=conexion.cursor()
  4.     cursor.execute("SELECT CODIGO,PRECIO,DETALLE FROM MOTOS LIMIT 1 OFFSET " + offset)
  5.     row = cursor.fetchone()
  6.     self.textocodigo.SetValue(row[2])
  7.     self.textocodigo2.SetValue(row[0])
  8.     self.textocodigo3.SetValue(row[1])

offset es una variable que iniciás en cero e incrementás en 1 cada vez que se llame al método. Con eso irás iterando sobre los registros de la base, sin obtener todos a la vez.

También deberías pensar en no abrir la base cada vez, a menos que la cierres tan pronto como dejes de usarla. Abrir y cerrar la base en cada llamada a la función puede ser detrimental para el rendimiento, quizás sea mejor que conserves un objeto connection y lo reuses.


Saludos.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:11.