-
Notifications
You must be signed in to change notification settings - Fork 0
ConectorBase
Written with StackEdit.
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