Skip to content
Daniel Garay edited this page May 25, 2014 · 9 revisions

Written with StackEdit.

ConectorBase


Aun en edición

Esta clase tiene como finalidad la unificación de métodos de acceso a los diferentes sistemas de administración de bases de datos, un nivel por encima de la implementación de DB-API de cada fabricante o módulo libre encontrado en la web que implemente ésta API.

###Atributos### La clase cuenta con los siguientes atributos:

  • _oConexion
`ConectorBase`. Almacena la Instancia de [`Conexion`][2] actualmente abierta con el sistema de base de datos. De aquí se solicita la creación de instancias de [`Cursor`][3] y se confirman o revierten los cambios realizados mediante comandos _DML_.
  • _cServidor
[`Cadena`][9]. Almacena el nombre o dirección IP del servidor que aloja al servicio de conexiones al sistema de base de datos.
Ej.
*127.0.0.1* o *localhost*.
  • _nPuerto
[`Entero`][11]. Almacena el número del puerto de escucha del servicio de conexión al sistema de base de datos.
Ej.
***MySQL*** por defecto se instala con el puerto **3306**.
***Oracle*** sin embargo se instala con el puerto **1521**.
  • _cServicio
[`Cadena`][9]. Almacena el nombre del servicio del sistema de base de datos.
Ej.
***SQL Server Express*** normalmente se instala con el nombre ***SQLEXPRESS*** en windows.
***SQL Server*** en cualquiera de sus versiones no express por defecto es ***MSSQLSERVER***.
  • _cCatalogo
[`Cadena`][9]. Almacena el nombre del catálogo (nomenclatura SQL Server) o esquema (nom. Oracle) al cual se desea acceder.
Ej.
***MySQL*** instala normalmente una base de datos que llamada ***test***.
  • _cUsuario
[`Cadena`][9]. Almacena el identificador de usuario de la base de datos.
  • _cContrasena
[`Cadena`][9]. Almacena la contraseña de acceso al servicio de base de datos.
*Obs.: Analizando si se debe de encapsular.*
  • _nTiempoEspera
[`Entero`][11]. Tiempo de espera, en segundos, para retorno de resultados de comandos ejecutados. Pasado este tiempo normalmente el comando en ejecución debería cancelarse y generar una excepción.
Valor por defecto es de 300 segundos (5 minutos).
  • _bMostrarSql
[`Booleano`][10]. Indica si se deben imprimir por salida estándar los comandos sql a medida que se van ejecutando.
Sólo recomendado para depuración ya que realizar la impresión por salida estándar consume un tiempo considerable.
Valor por defecto *Falso*.
  • _bConectado
[`Booleano`][10]. Indica si se pudo establecer o no la conexión al sistema de base de datos y si esta actualmente abierta. La implementación de esto se puede mejorar pero por el momento no es prioridad.

###Métodos### ####A continuación, un listado de los métodos que la clase define pero NO implementa:####

  • lConectar()
[`Lista`][4]. En su implementación, debería ser el método que tome los valores de atributos de la Instancia creada e intenta abrir un canal de comunicación con el sistema de base de datos.
Debe de retornar una [`Lista`][4], o [`Tupla`][5] (recomendado), de al menos 2 objetos, donde el primero siempre es un entero entre 1 y -1, incluídos, y el segundo, normalmente una cadena con un mensaje de estado.
Ej.
#Instanciamos la clase de implementación
oUtil = MySqlUtiles('localhost', '', 'employees', 'root', pwd)

\#invocamos al metodo
print oUtil.lConectar()

#muestra en pantalla
( 1, 'Ok' )   -> Resultado exitoso.
( -1, 'No existe la base de datos [Test]' ) -> Resultado fallido.
  • lDesconectar()
[`Lista`][4]. En su implementación, debería ser el método de finalización de la conexión entre el cliente ya el sistema de base de datos.
También debe de retornar una [`Lista`][4], o [`Tupla`][5] (recomendado), con al menos dos elementos, donde el primero es un entero entre 1 y -1, incluídos, según sea el caso.
Ej.
#invocamos al metodo
print oUtil.lDesconectar()

#muestra en pantalla
( 1, 'Ok' )   -> Resultado exitoso.
  • lConfirmar()
[`Lista`][4]. En su implementación, debería ser el método de confirmación de transacciones si es que la conexión se inició en modo `autocommit = False`.
También debe de retornar una [`Lista`][4], o [`Tupla`][5] (recomendado), con al menos dos elementos, donde el primero es un entero entre 1 y -1, incluídos, según sea el caso.
Ej.
#invocamos al metodo
print oUtil.lConfirmar()

#muestra en pantalla
( 1, 'Ok' )   -> Resultado exitoso.
  • lRevertir()
[`Lista`][4]. En su implementación, debería ser el método de reversión de transacciones si es que la conexión se inició en modo `autocommit = False`.
También debe de retornar una [`Lista`][4], o [`Tupla`][5] (recomendado), con al menos dos elementos, donde el primero es un entero entre 1 y -1, incluídos, según sea el caso.
Ej.
#invocamos al metodo
print oUtil.lRevertir()

#muestra en pantalla
( 1, 'Ok' )   -> Resultado exitoso.
  • lEjecutarConsulta(cConsultaSQL, tParametros)
[`Lista`][4]. En su implementación, debería ser el método de recuperación de registros desde una o varias tablas desde el sistema de base de datos.
También debe de retornar una [`Lista`][4], o [`Tupla`][5] (recomendado), con al menos dos elementos, donde el primero es un entero entre 1 y -1, incluídos, según sea el caso, y, si se ejecutó correctamente el segundo elemento es una Instancia de [`Cursor`][14].
`cConsultaSQL`= [`Cadena`][9]. sql con la consulta a ejecutar.
`tParametros` = Instancia de [`Tupla`][5] con los valores de los distintos parámetros de la consulta si los tuviere.
Ej.
#filtro por rango de valores
cSentencia = Employee().filtrar(Restriccion.Entre(nId=[10008, 10015]))

#ejecutamos la consulta
lResultado = oConexion.lEjecutarConsulta(cSentencia)

if lResultado[0] != 1: raise Exception(lResultado[1])

#recuperamos los campos de la clase
lCampos = Employee()._dicCampos.keys()

#recorremos las filas devueltas, Instanciamos la clase correspondiente
#e imprimimos su representacion
for fila in lResultado[1]: print Employee(**dict(zip(lCampos, fila)))
  • lEjecutarSentencia(cSentenciaSQL, tParametros)
[`Lista`][4]. En su implementación, debería ser el método de ejecución de comandos _DML_ que se espera no devuelvan valores desde el sistema de base de datos.
También debe de retornar una [`Lista`][4], o [`Tupla`][5] (recomendado), con al menos dos elementos, donde el primero es un entero entre 1 y -1, incluídos, según sea el caso.
`cSentenciaSQL`= [`Cadena`][9]. Comando SQL a ejecutar
`tParametros` = Instancia de [`Tupla`][5] con los valores de los distintos parámetros de la consulta si los tuviere.
Ej.
(pendiente)
  • lEjecutarProcedimiento(cComandoSQL, tParametros)
[`Lista`][4]. En su implementación, debería ser el método de ejecución de procedimientos almacenados del sistema de base de datos.
También debe de retornar una [`Lista`][4], o [`Tupla`][5] (recomendado), con al menos dos elementos, donde el primero es un entero entre 1 y -1, incluídos, según sea el caso, y, el segundo elemento queda a disposición tuya establecerlo.
`cSentenciaSQL`= [`Cadena`][9]. Comando SQL a ejecutar
`tParametros` = Instancia de [`Tupla`][5] con los valores de los distintos parámetros de la consulta si los tuviere.
Ej.
(pendiente)
  • bConectado():
[`Booleano`][10]. En su implementación, debería de devolver `True` o `False` dependiendo de si la conexión al sistema de base de datos está abierta o no en el momento en que se invoca al método.

####Listado de los métodos que la clase SÍ implementa:####

  • gRecuperar(clsClaseOTD, oRestricciones)
`Generador`. Ejecuta la consulta de datos aplicando las restricciones indicadas y devolviendo un [`Generador`][6] de instancias de la clase extendida de **OTDBase** especificada.
`clsClaseOTD`    = Instancia de clase derivada de **OTDBase**
`oRestricciones` = Instancia de **Restriccion**
Ej.
#ejecutamos la recuperacion de instancias a traves de un generador
gen = oConexion.lRecuperar(Employee, Restriccion.Entre(nId=[10070, 10090]))

#recorremos el generador e imprimimos su representacion
for emp in gen:
    print emp           #la Instancia en si
    
    #listamos el historial de departammentos del empleado
    for deptEmp in emp.DeptEmps:
        print deptEmp,
        print deptEmp.Department #los datos del Departamento

#muestra en pantalla
<10070 - Reuven Garigliano>
<0 - 10070 on d005> <d005 - Development>
<0 - 10070 on d008> <d008 - Research>
<10071 - Hisao Lipner>
<0 - 10071 on d003> <d003 - Human Resources>
<10072 - Hironoby Sidou>
<0 - 10072 on d005> <d005 - Development>
<10073 - Shir McClurg>
<0 - 10073 on d006> <d006 - Quality Management>
...
  • mostrarSQL(bValor):
Establece si se muestran o no las sentencias ejecutadas.
`bValor` = [`Booleano`][10]. Valor a establecer.
  • _mostrarComando(cComando):
Imprime en pantalla el comando parámetro.
`cComando` = [`Cadena`][9]. Comando SQL.

###Ejemplo de uso### Esta clase no debe ser utilizada directamente sino que primero debe ser implementada por otra clase derivada. Con este conjunto de archivos se provee la implementación de ejemplo para conectar a una base de datos MySQL

Clone this wiki locally