[Python-es] problema con sqlite3 y hilos

Miguel Barraza correo en miguelbarraza.com.ar
Jue Ago 30 23:50:59 CEST 2012


buenas, discculpa...no entendí.
como que la base debe ser creada desde el mismo hilo que lo llama?.

yo ya tengo una db creada con datos, debo consultarlo desde el socket server y entregarle la info por esa forma.

la clase que utilizo es esta:

#-*- encoding: utf-8 -*- 
from threading import Thread      
import sqlite3
#Clase con el hilo para atender a los clientes.  
#En el constructor recibe el socket con el cliente y los datos del  
#cliente para escribir por pantalla  
class pj(Thread):      

  def __init__(self, socket_cliente, datos_cliente):
    # LLamada al constructor padre, para que se inicialice de forma
    # correcta la clase Thread.
    Thread.__init__(self)
    # Guardamos los parametros recibidos.
    self.socket = socket_cliente
    self.datos = datos_cliente
    # conectamos a la base de datos:
    conn = sqlite3.connect('d:\mud\soft\mundo.db')
    self.db = conn.cursor()
    
entonces aquí en self.db ya dejo la conexión activa en ese hilo para llamar a la bd y consultarla. pero según leí en otra respuesta, solo puedo trabajar con una sola conexión...entonces tendría que activar conexión, consultar, y cerrar?...no se sobresaturaría sqlite con conexión activa a cada ratito?. osea abro y cierro todo el tiempo?...
lo que intento ahcer es un juego por telnet. y como la info se actualiza todo el tiempo ppensé en guardar toda la info en sqlite.

pero veo que hilos no es una buena forma o sqlite no se lleva con ella.
que otra forma me aconsejarían?.

saludos y gracias.

atte, Miguel






Subject: Re: [Python-es] problema con sqlite3 y hilos


    El 29 de agosto de 2012 21:24, Miguel Barraza <correo en miguelbarraza.com.ar> escribió:

      buenas, estoy haciendo una aplicación con sockets, cada cliente lo atiende en un hilo diferente.oserrarlilos 
      cada cliente hace consultas a una base sqlite3.
      pero al consultar me tira este error:

          self.db.execute(sql)
      ProgrammingError: SQLite objects created in a thread can only be used in that sa
      me thread.The object was created in thread id 2480 and this is thread id 3740

      al inicio hacía una sola conexión y le pasaba el puntero de conexión a el objeto que manejaba el cliente.
      pensé que ese era el error, así que hice una conexión por cada cliente dentro de la clase que gestiona cada conexión. y me tira el mismo error...así que llegué a la conclusión que sqlite no funciona con hilos...¿es eso cierto?...o de que forma puedo solucionar este problema?.

      lo que hice también fue hacer una conexión dentro de un objeto y pasar el puntero de ese objeto a todos los clientes, y hacer consultas a esa clase master para que devuelva los datos de base de datos. y igualmente tiró el mismo error.

      imagino que debe haber forma de trabajar con sqlite3 y hilos.
      así que por eso consulto: alguien se vio en este problema?, como lo pudo solucionar?.

      saludos a todos!.

      pd.: no copio parte del código ya que es bastante y no se donde exactamente podría estar el error...aunque como lo probé de varias formas y siempre tiró el mismo error creo que es la metodología, no es el código...tiene que haber alguna forma que no conozco para utilizar sqlite con hilos o procesos.

      atte, Miguel

      _______________________________________________
      Python-es mailing list
      Python-es en python.org
      http://mail.python.org/mailman/listinfo/python-es
      FAQ: http://python-es-faq.wikidot.com/



  El error te lo dice, el propio hilo tiene que crear la base de datos que usa, asi que procura que la base de datos la creas en el hilo, este mismo problema lo he tenido hace un rato:

  def getElement(indice):
          databank.execute("select * from compuestos where id==%i"%indice)
          componente=databank.fetchone()
      return componente
   
  como databank era creado al importar el modulo, en el hilo principal, esa base de datos solo la podra usar sin quejarse el hilo principal, he tenido que añadir la linea de creacción de base de datos en la propia función para que la hubiera creado el propio hilo y no me diera error:

  def getElement(indice):
          databank=sqlite3.connect(databank_name).cursor()
          databank.execute("select * from compuestos where id==%i"%indice)
          componente=databank.fetchone()
      return componente




------------------------------------------------------------------------------


  _______________________________________________
  Python-es mailing list
  Python-es en python.org
  http://mail.python.org/mailman/listinfo/python-es
  FAQ: http://python-es-faq.wikidot.com/
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20120830/d4101aad/attachment.html>


Más información sobre la lista de distribución Python-es