Foros del Web » Programando para Internet » Python »

Patrón singleton para acceso a base de datos

Estas en el tema de Patrón singleton para acceso a base de datos en el foro de Python en Foros del Web. Hola! Necesito acceder a dos bases de datos, pero sólo quiero que haya una conexión y un objeto. Por eso he pensado en el patrón ...
  #1 (permalink)  
Antiguo 16/06/2009, 01:13
 
Fecha de Ingreso: febrero-2006
Mensajes: 174
Antigüedad: 18 años, 9 meses
Puntos: 0
Patrón singleton para acceso a base de datos

Hola!

Necesito acceder a dos bases de datos, pero sólo quiero que haya una conexión y un objeto. Por eso he pensado en el patrón singleton, porque quiero que todos accedan a la base de datos a través de un mismo objeto.

He estado buscando bastante al respecto, y la verdad es que no saca nada en claro, porque cada página que he buscado lo hace de una manera diferente.

Si alguien me puede decir cómo se hace un patrón singleton para acceder a la base de datos, le estaría muy agradecida.

Estoy intentando algo así:

Código:
class GestorBD(object):
    instance=None


    def __new__(cls, *args, **kargs):
        if cls.instance is None:
            cls.instance=object.__new__(cls, *args, **kargs)
            
        return cls.instance
    
    def conectar(self):
        self.conexion=psycopg.connect("host='xxx.xxx.xxx.xxx' port= 'xxx' dbname='xx' user= 'xx' password= 'xx'")
    
    def desconexion(self):
        self.conexion.close()
        
    def execute(self, consulta):
        self.cursor=self.conexion.cursor()
        self.cursor.execute(consulta)        
        registros=self.cursor.fetchall()
        return registros
    
    def modify(self, consulta):
        self.cursor=self.conexion.cursor()
        self.cursor.execute(consulta)  
    
    def commit(self):
        self.conexion.commit()
Muchas gracias y un saludo!
  #2 (permalink)  
Antiguo 16/06/2009, 18:00
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: Patrón singleton para acceso a base de datos

Ejemplo de un singleton
Código python:
Ver original
  1. class  Singleton (object):
  2.    instance = None      
  3.     def __new__(cls, *args, **kargs):
  4.         if cls.instance is None:
  5.             cls.instance = object.__new__(cls, *args, **kargs)
  6.         return cls.instance
  7.  
  8. #Usage
  9. mySingleton1 =  Singleton()
  10. mySingleton2 =  Singleton()
  11.  
  12. #mySingleton1 y mySingleton2 son la misma instancia
  13. print mySingleton1 is mySingleton2


En tu codigo tenias unos cuantos enters de mas, los borre y lo publico
Código python:
Ver original
  1. class GestorBD(object):
  2.     instance=None
  3.     def __new__(cls, *args, **kargs):
  4.         if cls.instance is None:
  5.             cls.instance=object.__new__(cls, *args, **kargs)          
  6.         return cls.instance
  7.    
  8.     def conectar(self):
  9.         self.conexion=psycopg.connect("host='xxx.xxx.xxx.xxx' port= 'xxx' dbname='xx' user= 'xx' password= 'xx'")
  10.    
  11.     def desconexion(self):
  12.         self.conexion.close()
  13.        
  14.     def execute(self, consulta):
  15.         self.cursor=self.conexion.cursor()
  16.         self.cursor.execute(consulta)        
  17.         registros=self.cursor.fetchall()
  18.         return registros
  19.    
  20.     def modify(self, consulta):
  21.         self.cursor=self.conexion.cursor()
  22.         self.cursor.execute(consulta)  
  23.    
  24.     def commit(self):
  25.         self.conexion.commit()
  #3 (permalink)  
Antiguo 17/06/2009, 02:08
 
Fecha de Ingreso: febrero-2006
Mensajes: 174
Antigüedad: 18 años, 9 meses
Puntos: 0
Respuesta: Patrón singleton para acceso a base de datos

Hola! Gracias por la respuesta. Al final lo he dejado así:

Código PHP:
class GestorBD(object):
  
    
instance=None

    def __new__
(cls, *args, **kargs):
        if 
cls.instance is None:
            
cls.instance=object.__new__(cls, *args, **kargs)          
        return 
cls.instance

    def __init__
(self):
       
self.conexion=psycopg.connect("host='xxx.xxx.xxx.xxx' port= 'xxx' dbname='xx' user= 'xx' password= 'xx'")
    
    
def execute(selfconsulta):
        
self.cursor=self.conexion.cursor()
        
self.cursor.execute(consulta)        
        
registros=self.cursor.fetchall()
        return 
registros
..... 
La duda que tengo es la siguiente: cada vez que se intenta crear un objeto GestorBD se ejecuta el método __new__ y si ve que ya hay una instancia es esa la que devuelve. Hasta ahí está claro. Pero después se llama al __init__ y ahí se hace la conexión. ¿Se está creando una conexión por cada llamada al único objeto creado? ¿Os el la misma conexión? Lo que yo necesito es que haya una conexión por cada objeto único singleton.

Un saludo
  #4 (permalink)  
Antiguo 17/06/2009, 09:35
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: Patrón singleton para acceso a base de datos

Código python:
Ver original
  1. class GestorBD(object):
  2.     instance=None
  3.     i = 0
  4.     def __new__(cls, *args, **kargs):
  5.         if cls.instance is None:
  6.             cls.instance=object.__new__(cls, *args, **kargs)          
  7.         return cls.instance
  8.  
  9.     def __init__(self):
  10.         self.i += 1
  11.         print "Me he ejecutado", self.i, "veces"
  12.  
  13. singleton1 = GestorBD()
  14. singleton2 = GestorBD()
  15. print singleton1.i
  16. print singleton2.i

Inicia una nueva conexión, pero esta sigue siendo única. En pocas palabras diaria que actualiza la conexión.

Puedes verlo en el ejemplo anterior, cada vez que creas un objeto este primero llama a __new__ y luego a __init__. Pero con cada llamada a __init__ redefines el objeto.

Una solucion prodria ser, ponerlo de la siguiente manera:
Código python:
Ver original
  1. class GestorBD(object):
  2.     instance=None
  3.     conexion=psycopg.connect("host='xxx.xxx.xxx.xxx' port= 'xxx' dbname='xx' user= 'xx' password= 'xx'")
  4.  
  5.     def __new__(cls, *args, **kargs):
  6.         if cls.instance is None:
  7.             cls.instance=object.__new__(cls, *args, **kargs)          
  8.         return cls.instance
  9.  
  10.     def execute(self, consulta):
  11.         self.cursor=self.conexion.cursor()
  12.         self.cursor.execute(consulta)        
  13.         registros=self.cursor.fetchall()
  14.         return registros
  #5 (permalink)  
Antiguo 25/06/2009, 07:43
 
Fecha de Ingreso: febrero-2006
Mensajes: 174
Antigüedad: 18 años, 9 meses
Puntos: 0
Respuesta: Patrón singleton para acceso a base de datos

Gracias por el ejemplo. Ha quedado claro.

Un saludo!
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 03:06.