Mostrando entradas con la etiqueta BD Relacional. Mostrar todas las entradas
Mostrando entradas con la etiqueta BD Relacional. Mostrar todas las entradas

lunes, 21 de octubre de 2013

PL/pgsql

 

Vamos a abordar un tema muy importante para el desarrollo de cualquier proyecto, en este caso visto desde la parte de las base de datos y es precisamente el uso los procedimientos almacenados, en caso de postgreSQL las funciones, en otras palabras vamos a utilizar el lenguaje procedural PL/pgSQL de PostgreSQL en la resolución de problemas.

image


Ventajas

  • Cuando la ejecución del procedimiento ocurre en el servidor, es probable que aumente el rendimiento de nuestra aplicación al no tenerse que mandar datos entre el cliente y el servidor, y no tener que procesar resultados intermedios en el cliente para obtener el resultado final.
  • Al tener la lógica de la aplicación implementada en la Base de datos no tendremos que implantarla en los clientes, con el significativo ahorro de líneas de código redundante.
  • Si tenemos diferentes tipos de clientes implementados en diferentes sistemas ó lenguajes de programación y a la vez accediendo a la misma base de datos, no tendremos que programar la misma lógica en todos, al estar disponible en la base de datos la solución de nuestro problema.

Los procedimientos almacenados (stored procedures) en PostgreSQL se les llaman funciones, las cuales están almacenadas en la base de datos y listas para ser usadas. En postgreSQL se utiliza para la programación de funciones los lenguajes procedurales.

Lenguajes procedurales

PL/Perl: Es un lenguaje de programación imperativo y permite más control que el álgebra relacional de SQL.

PL/Python: Utiliza el entorno de ejecución de Python restringido. Funciona como un lenguaje de confianza.

PL/Java: Es un módulo libre que trae procedimientos almacenados, disparadores, y funciones para PostgreSQL backend a través de la interfaz estándar JDBC.

Y el PL/pgSQL es muy parecido al lenguaje PL/SQL utilizado por Oracle, es fácil de aprender, potente y siempre está disponible. Es un lenguaje estructurado en bloques y posee como mínimo un bloque principal en el procedimiento almacenado y dentro de este pueden existir sub-bloques. El mismo se puede utilizar para crear las funciones y disparadores (triggers), este último lo explicaremos en próximos artículos.

Además con el PL/PGSQL se pueden añadir estructuras de control SQL, realizar cálculos complejos entre otra serie de operaciones muy importantes para la solución de nuestros problemas.

A continuación vamos a pasar a ver la estructura de una función para entenderla mejor:

CREATE [OR REPLACE] FUNCTION
nombre_funcion([[ argmodo ][ argnombre ] argtipo [,...]])
RETURNS tipo AS $$
[ DECLARE ]
[ declaraciones de variables ]
BEGIN
Codigo
END;
$$ LANGUAJE plpgsql

Es importante señalar que los comentarios se definen /* mi comentario */ y los tipos de datos se declaran por ejemplo id INTEGER;

De todas maneras vamos a cerrar este artículo con un ejemplo muy sencillo pero que ilustra claramente la sintaxis que acabamos de poner.

CREATE FUNCTION sumar (x integer, y integer) RETURN INTEGER AS $$
Declare
Resultado integer;
BEGIN
Resultado:=x+y;
Return resultado;
END
$$ LANGUAJE plpgsql

Las funciones se pueden complejizar tanto como queramos en nuestras soluciones, los exhortamos a que continúen abordando sobre estos temas tan importantes, comiencen a utilizar consultas dentro de las funciones y a practicar el funcionamiento de las mismas.

{ Leer Más }


martes, 10 de septiembre de 2013

Desarrollando una lista de TO-DO usando base de datos y el Framework ZK.

clip_image002

Te mostraremos, paso a paso, como construir una sencilla aplicación web con ZK que use una base de datos. La aplicación web permitirá almacenar sucesos que vamos a hacer en el futuro o sea una lista de TO-DO. Una aplicación web así, requeriría usar una base de datos. Para la conclusión de este tutorial usaremos una base de datos Java (HSQL DB) la cual no requiere que instalemos un servidor de base de datos [1].

Pasos para ejecutar la aplicación:

  1. Descargue el código fuente de aquí.
  2. cd todo
  3. mvn jetty:run (si usted no tiene maven instalado por favor descárguelo aquí )
  4. Abra su navegador y coloque la siguiente url: http://localhost:8080/todo

clip_image003

Todos los Escenarios

§ Introduce toda la información relativa a un evento y presiona el botón  Add  para insertarlo en la base de datos.

§ Selecciona cualquier fila en la tabla para mostrar la información del evento en los campos de abajo para que modificar su información, después presiona el botón  Update  para modificar la información.

§ Selecciona cualquier fila en la tabla y presiona el botón  Delete  para eliminar el "Event" seleccionado.

Modelo

En los siguientes párrafos, el esquema de la base de datos, el objeto del dominio y el objeto DAO serán introducidos.

Esquema de la base de datos

Una tabla de la base de datos la cual va a almacenar los datos de nuestra aplicación, necesitará los siguientes atributos: event id, event name, event priority and event date.

El esquema de base de datos está listado abajo.

Field

Type

id

varchar(50)

name

varchar(50)

priority

int

date

date

Objeto Dominio

Para la la tabla de arriba, creamos el objeto de dominio correspondiente, como se indica:

public class TodoEvent {

private String id;

private String name;

private int priority;

private Date date;

public TodoEvent(String id, String name, int priority, Date date) {

this.id = id;

this.name = name;

this.priority = priority;

this.date = date;

}

// getter and setter methods are ommited, please refer to the source code.

}

Objeto de Acceso a Datos


Para que fácilmente se acceda a nuestra base de datos necesitaremos un objeto DAO con los siguientes métodos: findAll(),delete(),insert() and update().

public class EventDAO {

// The implementation is ommited, please refer to the source code.

public List<TodoEvent> findAll() {

}

public boolean delete(TodoEvent evt) {

}

public boolean insert(TodoEvent evt) {

}

public boolean update(TodoEvent evt) {

}

}

La Vista


Tu primer componente ZK


El primer paso es crear un fichero cuya extensión debe ser zul, pongamos todo.zul, y situamos este fichero bajo el directorio de nuestra aplicación web, por ejemplo, $TOMCAT_HOME/webapps/ProjectName/. Declaras un componente ZK de igual forma a como declaras un componente usando HTML.

Prueba a declarar tu primer componente  window  de la siguiente forma:

<window title="To do list" border="normal">

</window>

Después inicia Tomcat y usa el navegador para visitar la página, eg. http://localhost:8080/todo/todo.zul. El resultado se muestra abajo,  window  con el título 「To do List」.

Todo en ZK es un componente. Puedes cambiar el título, el alto y el borde de tu  window  Es muy sencillo e intuitivo. Intenta cambiar estos atributos y comprueba el resultado.

Relaciones jerárquicas entre los componentes de ZK


Lo siguiente, vamos a intentar enriquecer esta página con más componentes ZK. Para mostrar datos en una tabla, podemos usar un componente  listbox  el cual está diseñado para mostrar datos. Para insertar un listbox lo declaramos dentro de los tags del componente  window, como se indica:

<window title="To do list" border="normal">

<listbox id="box" multiple="true" rows="5">

</listbox>

</window>

En este ejemplo, el componente  listbox  es un componente hijo de  window. Sí, hay relaciones jerárquicas entre los componentes de ZK, te encontrarás una excepción UI si intentas declarar un componente dentro de un contexto equivocado, por ejemplo, al declarar un componente  window  como hijo de un componente  listbox.

Un componente anidado


Un listbox es un componente anidado, el cual soporta dos tipos de componentes hijos, listhead (aka: columna de la tabla), and listitem (aka: fila de la tabla). Con la declaración del  listbox, asignamos el atributo id a 「box」, ahora podemos usar este atributo para referenciar el listbox.

<window id="win" title="To do list" width="640px" border="normal">

<listbox id="box" multiple="true" rows="5">

<listhead>

</listhead>

<listitem>

</listitem>

</listbox>

</window>

Aún no hemos terminado. Vamos a declarar tres componentes listheader dentro de los tags de listhead. Necesitamos tres columnas -- 「Item」, 「Priority」, and 「Date」 -- dentro de la tabla, como se indica:

<window id="win" title="To do list" width="640px" border="normal">

<listbox id="box" multiple="true" rows="5">

<listhead>

<listheader label="Item" />

<listheader label="Priority" width="80px" />

<listheader label="Date" width="170px" />

</listhead>

<listitem>

</listitem>

</listbox>

</window>

Tenemos tres columnas en nuestra tabla, cada fila de la tabla también requerirá tres campos. Declaramos tres componentes listcell dentro de los tags del componente listitem.

<window id="win" title="To do list" width="640px" border="normal">

<listbox id="box" multiple="true" rows="5">

<listhead>

<listheader label="Item" />

<listheader label="Priority" width="80px" />

<listheader label="Date" width="170px" />

</listhead>

<listitem>

<listcell />

<listcell />

<listcell />

</listitem>

</listbox>

</window>

La estructura anidada del componente  listbox  quedaría así:

listbox 
+-- listhead
|    |
|    +-- listheader
|
+-- listitem
      |
     +-- listcell

Componentes para introducir información


En adición a mostrar estos eventos en el  listbox, necesitamos introducir información relativa al evento, incluyendo el evento name (campo texto), el evento priority (campo numérico) y el evento date (campo fecha). Para lograr esto, declare un textbox, un intbox y un datebox dentro de los tags del componente  window  de la siguiente forma:

<window id="win" title="To do list" width="640px" border="normal">

<listbox id="box" multiple="true" rows="5">

<listhead>

<listheader label="Item" />

<listheader label="Priority" width="80px" />

<listheader label="Date" width="170px" />

</listhead>

<listitem>

<listcell />

<listcell />

<listcell />

</listitem>

</listbox>

Item: <textbox id="name" cols="25" />

Priority: <intbox id="priority" cols="1" />

Date: <datebox id="date" cols="8" />

<button id="add" label="Add" />

<button id="update" label="Update" />

<button id="delete" label="Delete" />

</window>

 


Componentes Layout


Para distinguir los componentes de entrada de datos (input) de los componentes listbox de abajo, declaramos un groupbox para agrupar los componentes. Esto dibujará un borde alrededor de los componentes que estén contenidos dentro del groupbox, en este caso, los componentes de entrada de datos (input).

<window id="win" title="To do list" width="640px" border="normal">

<listbox id="box" multiple="true" rows="5">

<listhead>

<listheader label="Item" />

<listheader label="Priority" width="80px" />

<listheader label="Date" width="170px" />

</listhead>

<listitem>

<listcell />

<listcell />

<listcell />

</listitem>

</listbox>

<groupbox>

<caption label="Event" />

Item: <textbox id="name" cols="25" />

Priority: <intbox id="priority" cols="1" />

Date: <datebox id="date" cols="8" />

<button id="add" label="Add" />

<button id="update" label="Update" />

<button id="delete" label="Delete" />

</groupbox>

</window>

Adicionalmente a los componentes  groupbox  declaramos un componente  caption  para mostrar una etiqueta 「Event」 a lo largo de la caja que agrupa a los componentes. El componente caption trabaja de forma similar al legendario elemento en HTML.

Controlador


Nuestros requisitos incluyen mostrar, añadir, editar y borrar sucesos/eventos. En los siguientes párrafos, implementaremos las interacciones entre nuestra aplicación web y la base de datos.

Definiendo un Controlador


El primer paso es definir un EventController el cual herede de org.zkoss.zk.ui.util.GenericForwardComposer.

Implementando org.zkoss.zk.ui.util.GenericForwardComposer

Crea un EventController el cual heredará de org.zkoss.zk.ui.util.GenericForwardComposer permitiéndote un fácil acceso a la vista y definir un CRUD mediante los métodos Java definidos.

// org.zkforge.todo.event.EventController.java

public class EventController extends GenericForwardComposer {

private static final long serialVersionUID = -9145887024839938515L;

private EventDAO eventDao = new EventDAO();

// Note: Something is omitted at here. You can view detail about this class on source code.

public List<TodoEvent> getAllEvents() {

return eventDao.findAll();

}

public void onClick$add() {

}

public void onClick$update() {

}

public void onClick$delete() {

}

}

Asociando el Controlador con la Vista

Para implementar la interacción entre la Vista y el Controlador asignamos el atributo apply al componente window en la ruta de nuestro EventController.

<window id="win" title="To do list" width="640px" border="normal"

apply="org.zkforge.todo.event.EventController">

......

Visualizando datos en una Vista


Para visualizar los datos recuperados de la base de datos en nuestra Vista solo requerimos tres pasos:


  • Activar un mecanismo de DataBinding Mechanism
  • Asociar datos con la Vista
  • Definir una plantilla

Activando el mecanismo de DataBinding

Para usar el mecanismo Data Binding, deberemos activar el Data Binding Manager (org.zkoss.zkplus.databind.AnnotateDataBinderInit) en la parte superior de la página.

<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit"?>

<window id="win" title="To do list" width="640px" border="normal"

apply="org.zkforge.todo.event.EventController">

....

Asociando los datos con la vista

El paso siguiente es recuperar los datos de la base de datos mediante el EventController usando la expresión (win$composer.allEvents) para invocar EventController.getAllEvents(). El método EventController.getAllEvents() devuelve una lista que contiene todos los eventos almacenados en la base de datos que pueden ser asociados al atributo model del Listbox.

<window id="win" title="To do list" width="640px" border="normal"

apply="org.zkforge.todo.event.EventController">

<listbox id="box" multiple="true" rows="5" model="@{win$composer.allEvents}">

....

Puedes seguir los siguientes pasos para definir una plantilla de Interfaz de Usuario para renderizar los datos dentro de la vista.

Definiendo una plantilla

Es posible definir una plantilla de interfaz de usuario para renderizar DataBinding dentro de los correspondientes componentes de interfaz de usuario. Esto se logra gracias a la utilización de los atributos que ofrece el componente "listitem" definiendo una variable para representar cada instancia a reflejar.

<window id="win" title="To do list" width="640px" border="normal"

apply="org.zkforge.todo.event.EventController">

<listbox id="box" multiple="true" rows="5"

model="@{win$composer.allEvents, load-after='add.onClick, delete.onClick, update.onClick'}"

selectedItem="@{win$composer.current}">

<listhead>

<listheader label="Item" sort="auto(name)" />

<listheader label="Priority" width="80px" sort="auto(priority)" />

<listheader label="Date" width="170px" sort="auto(date)" />

</listhead>

<listitem self="@{each='event'}" value="@{event}">

<listcell label="@{event.name}" />

<listcell label="@{event.priority}" />

<listcell label="@{event.date}" />

</listitem>

</listbox>

Para más información, por favor dirígete a Associate UI Components with a Collection.

Sincronización de vistas


Una vez el usuario selecciona un ToDoEvent en el listbox, Necesitamos mostrarlo en el componente groupbox también. Sería mucho mejor si este tedioso trabajo fuera realizado de forma automáticamente. Data Binding es la respuesta! Simplemente asocia los datos con todo lo relacionado con los componentes de UI. El DataBinding se sincronizará entonces con todos los componentes de Interfaz de Usuario una vez la propiedad ha sido modificada.


  • Definir una instancia en un Controlador
  • Asociar múltiples componentes UI a la instancia

Definir una instancia "ToDoEvent" a un Controlador

Define una instancia ToDoEvent' en EventController, y define métodos getter y setter para que puedan ser accesibles desde la vista.

// org.zkforge.todo.event.EventController.java

public class EventController extends GenericForwardComposer {

private TodoEvent current = new TodoEvent();

// Omitted...

public TodoEvent getCurrent() {

return current;

}

public void setCurrent(TodoEvent current) {

this.current = current;

}

Asociando múltiples componentes UI con la instancia EventController

Primero, asocia la instancia EventController con la propiedad selectedItem del listbox. Después, asocia las propiedades del ToDoEvent con el correspondiente componente UI, incluyendo textbox, intbox, y datebox. Una vez el usuario selecciona un item en un listbox, la instancia se actualizará en relación a los componentes UI.

<listbox id="box" multiple="true" rows="5"

model="@{win$composer.allEvents, load-after='add.onClick, delete.onClick, update.onClick'}"

selectedItem="@{win$composer.current}">

<!-- Omitted -->

<groupbox>

<caption label="Event" />

Item: <textbox id="name" cols="25" value="@{win$composer.current.name}" />

Priority: <intbox id="priority" cols="1" value="@{win$composer.current.priority}" />

Date: <datebox id="date" cols="8" value="@{win$composer.current.date}" />

Sincronizando la vista con la base de datos


Además de mostrar los datos de la base de datos en la vista, nos gustaría implementar eventos para añadir, actualizar y eliminar. Esta funcionalidad requiere de tres pasos, monitorizar la actividad del usuario, interactuando con los controladores para actualizar la base de datos y actualizar la vista.


  • Registrar el evento Listener en el controlador
  • Actualizar la vista usando Databinding

Registrar el evento Listener en el Controlador

Para monitorizar la actividad del usuario, simplemente registramos un evento listener onClick' en los siguientes tres botones add, update and delete. Cuando cliqueamos en estos botones que se corresponden a los métodos definidos en EventController estos serán invocados. Estos métodos son definidos así:

public class EventController extends GenericForwardComposer {

private EventDAO eventDao = new EventDAO();

// Omitted...

public void onClick$add() {

if (current != null) {

current.setId(UUID.randomUUID().toString());

if (validate(current)) {

// insert into database

eventDao.insert(current);

}

}

}

public void onClick$update() {

if (current != null && validate(current)) {

// update database

eventDao.update(current);

}

}

public void onClick$delete() {

if (current != null && validate(current)) {

eventDao.delete(current);

}

}

}

<button id="add" label="Add" />

<button id="update" label="Update" />

<button id="delete" label="Delete" />


Actualizar la vista usando Databinding

Después de interactuar con la base de datos, el último paso es actualizar la vista. Simplemente notificar al Databinding para que actualice el modelo por ti, cuando el usuario cliqueé en cualquier botón. Intenta registrar un atributo load-after en el atributo model del listbox, y el Databinding actualizará la vista automáticamente si el evento especificado es capturado.

<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit"?>

<window id="win" title="To do list" width="640px" border="normal"

apply="org.zkforge.todo.event.EventController">

<listbox id="box" multiple="true" rows="5"

model="@{win$composer.allEvents, load-after='add.onClick, delete.onClick, update.onClick'}"

selectedItem="@{win$composer.current}">

<!-- Omitted... -->

<button id="add" label="Add" />

<button id="update" label="Update" />

<button id="delete" label="Delete" />

</groupbox>

</window>

Eso es todo, esperamos que le sea útil y quedamos al tanto de sus comentarios.




{ Leer Más }


martes, 23 de julio de 2013

Postgresql + CodeIgniter

Ya que hemos avanzado un poco en el mundo de las consultas, ya citado en el artículo anterior vamos a introducirnos en la utilización de las mismas pero enfocados a un marco de trabajo llamado codeIgniter, framework que goza de gran prestigio en los desarrolladores y empresas que eligen php como lenguaje de programación para desarrollar sus proyectos.

¿Qué es CodeIgniter?

CodeIgniter es un Entorno de Desarrollo de una Aplicación - una herramienta de sistema - para gente que construye sitios web usando PHP. El objetivo es habilitar el desarrollo de proyectos mucho más rápido de lo que podría si escribiese código desde cero, a través de proveer un rico conjunto de librerías para tareas comúnmente necesarias, tanto como una simple interface y estructura lógica para acceder a estas librerías. CodeIgniter le permite concentrarse creativamente en su proyecto minimizando el volumen de código necesario para una tarea determinada.

¿Para quién es CodeIgniter?

CodeIgniter es correcto para usted si:

  • Quiere un entorno de trabajo con un pequeño punto de apoyo.
  • Necesita un desempeño excepcional.
  • Necesita amplia compatibilidad con cuentas de hosting estándar que corren una variedad de versiones y configuraciones de PHP.
  • Quiere un entorno de trabajo que requiere casi nula configuración.
  • Quiere un entorno de trabajo que no requiera usar línea de comando.
  • Quiere un entorno de trabajo que no requiera adherir a reglas de codificación estrictas.
  • No está interesado en monolíticas librerías de gran escala como PEAR.
  • No quiere ser forzado a aprender un lenguaje de plantillas (aunque una sintaxis de plantillas está opcionalmente disponible si lo desea).
  • Evita complejidad, favoreciendo las soluciones simples.
  • Necesita clara, exhaustiva documentación.

Ya explicado más menos sobre el framework de trabajo que vamos a usar nuestras consultas y sin desviarnos del tema central que son los gestores de base de datos y en nuestro caso particular postgres vamos a pasar a ver algunos aspectos que les resultarán muy interesantes.

CodeIgniter está basado en el patrón de desarrollo Modelo-Vista-Controlador. MVC es una aproximación al software que separa la lógica de la aplicación de la presentación. En la práctica, permite que sus páginas web contengan mínima codificación ya que la presentación es separada del código PHP.

  • El Modelo representa la estructura de datos. Típicamente sus clases de modelo contendrán funciones que lo ayudarán a recuperar, insertar y actualizar información en su base de datos.
  • La Vista es la información que es presentada al usuario. La Vista normalmente será una página web, pero en CodeIgniter, una vista también puede ser un fragmento de una página como un encabezado o un píe de página. También puede ser una página RSS, o cualquier otro tipo de "página".
  • El Controlador sirve como un intermediario entre el Modelo, la Vista y cualquier otro recurso necesario para procesar la petición HTTP y generar una página web.

CodeIgniter tiene un enfoque bastante flexible del MVC, ya que los Modelos no son requeridos. Si no necesita agregar separación, o descubre que mantener los modelos requiera más complejidad que quería, puede ignorarlos y construir su aplicación mínimamente usando Controladores y Vista. CodeIgniter también le permite incorporar sus códigos existentes, o incluso desarrollar librerías de núcleo para el sistema, habilitándolo a trabajar en una forma que hace que tenga más sentido para usted.

Hasta aquí aunque parezca que se sale un poco del tema no lo creas así porque es necesario que entiendas que terrenos pisas para pasar a la parte que nos interesa, en nuestro caso vamos a introducirnos en la capa del Modelo aquí es donde vamos a poner nuestras consultas a las base de datos.

¿Qué es un modelo?

Los modelos son clases PHP que se han diseñado para trabajar con la información en su base de datos. Por ejemplo, digamos que usted usa CodeIgniter para administrar un blog. Puede que tenga una clase de modelo que contiene funciones para insertar, actualizar y recuperar datos de su blog. Aquí está un ejemplo de lo que podría ser la clase del modelo:

Nota: Las funciones en el ejemplo anterior usan funciones de base de datos Active Record.

Y aquí es donde queríamos llegar a Active Record.

CodeIgniter usa una versión modificada del Patrón de Base de Datos Active Record. Este patrón permite obtener, insertar y actualizar información en tu base de datos con mínima codificación. En algunos casos, sólo una o dos líneas de código son necesarias para realizar una acción de base de datos. CodeIgniter no requiere que cada tabla de la base de datos sea un propio archivo de clase. Se permite una interface más simplificada

Más allá de la simplicidad, un beneficio mayor de usar la Active Record es que te permite crear una aplicación independiente de la base de datos que usa, ya que la sintaxis de consulta es generada por cada adaptador de base de datos. También permite consultas más seguras.

A continuación vamos a pasar a ilustrar algunos ejemplos de consultas usando este patrón no hay nada mejor para entender que ejemplos reales. Las siguientes funciones permiten construir una sentencia SELECT SQL.

Ejemplo # 1 Ejecuta la consulta de selección y devuelve el resultado. Puede ser usado solo, para traer todos los registros de una tabla:

$consulta = $this->db->get('mitabla');

Produce: SELECT * FROM mitabla

Ejemplo # 2 Permite escribir la porción de SELECT de tu consulta:

$this->db->select('titulo, contenido, fecha');
$consulta = $this->db->get('mitabla');

Produce: SELECT titulo, contenido, fecha FROM mitabla


Ejemplo # 3 Permite escribir una porción JOIN de la consulta:
$this->db->select('*');
$this->db->from('blogs');
$this->db->join('comentarios', 'comentarios.id = blogs.id');
$query = $this->db->get();
Produce:
SELECT * FROM blogs
JOIN comentarios ON comentarios.id = blogs.id

Con estos 3 ejemplos vamos cerrando por esta artículo esperando que siempre sea de su agrado, y sobre todo que le pueda servir a solucionar problemas, si quiere seguir abordando sobre el tema puede visitar la ayuda de CodeIgniter y recuerde seguirnos en próximos artículos no olvide visitar nuestro blog.

{ Leer Más }


jueves, 18 de julio de 2013

Realizar consultas a una base de datos PostgreSQL empleando las instrucciones del lenguaje SQL.

clip_image002

Una vez que ya nos hemos introducido un poco en el mundo de las base en dos artículos anteriores, vamos a comenzar a ver cómo podemos consultar los datos registrados en ellas, para ello vamos a ir ilustrado algunos ejemplos y ver algunos ejercicios prácticos que sin duda nos van a ir ayudando mucho más a comprender de lo que hablamos:

La sentencia SELECT es usada para obtener la información guardada en una tabla. La forma general de esta sentencia es:

SELECT Información 

FROM Tabla

WHERE Condición.

Aquí, Información es la información que queremos ver. Esta puede ser una lista de columnas, o un * para indicar "todas las columnas".

Tabla indica el nombre de la tabla de la cual vamos a obtener los datos.

La cláusula WHERE es opcional. Si está presente, la Condición especifica las condiciones que los registros deben satisfacer para que puedan ser mostrados.

La manera más sencilla de la sentencia SELECT es cuando se recuperan todos los datos de la tabla: SELECT * FROM public."trabajadores";

Si no deseamos ver los registros completos de una tabla, entonces tenemos que usar los nombres de las columnas en las que estamos interesados separándolas por coma.

SELECT nombre, apellido1, apellido2, salario FROM trabajadores;

También es posible mostrar columnas calculadas a partir de la información contenida en otras columnas de la tabla. Ejemplo:

SELECT nombre, salario, salario*0.3 FROM trabajadores;

Los campos en la tabla resultante se muestran en el orden en que los solicitamos con la sentencia SELECT independientemente de cuál sea el orden que tengan en la estructura de la tabla.

SELECT nombre, apellido1, apellido2 FROM trabajadores; 

O podemos intercambiar el orden por ejemplo:

SELECT nombre, apellido1, apellido2 FROM trabajadores;

En ocasiones la cantidad de registros que recuperamos es muy grande y el resultado de la consulta ocupa varias pantallas. Es posible “limitar” la cantidad de filas que se mostrarán como resultado de una consulta empleando la cláusula LIMIT de la manera siguiente:

SELECT * FROM trabajadores LIMIT 5;

¿Qué podemos hacer para mostrar sólo el 3er registro en la tabla trabajadores?

En Postgre las posiciones de los registros en la tabla comienzan a contarse a partir de cero. EL primer registro está en la fila cero. El segundo registro está en la fila 1 y así sucesivamente hasta el registro n que estará en la fila n-1. Por tanto para mostrar el registro que ocupa la 3ra posición debemos recuperar el registro de la fila #2 y para lo cual podemos usar la cláusula LIMIT de la manera siguiente:

SELECT * FROM trabajadores LIMIT 1 OFFSET 2

Con LIMIT 1 OFFSET 2 estamos ordenando a PostgreSQL que devuelva 1 registro a partir de la fila 2.

Ahora vamos a pasar a explicar una función que consideramos pueda ser muy útil e interesante para los usuarios: CAST, aplicando la función CAST podemos convertir una cadena que contenga números en su representación como número tal como se muestra a continuación:

CAST (SUBSTR(idnum,10,1) AS INTEGER)

Con esta expresión extraemos el carácter que ocupa la posición 10 en el número de identidad y lo convertimos o representamos como un número entero

PostgreSQL posee una estructura muy útil que permite seleccionar cuál debe ser el valor definitivo de campos calculados a partir de evaluar expresiones aritméticas que devuelvan un valor entero. La sintaxis de esta estructura es:

CASE expression

WHEN value THEN result

[WHEN ...]

[ELSE result]

END


Ejemplos de su uso:

CASE CAST (SUBSTR(idnum,10,1) AS INTEGER ) % 2 

WHEN 0 THEN ‘HOMBRE’

WHEN 1 THEN ‘MUJER’

END

Un posible problema real para utilizar esta función de manera muy práctica puede ser a partir de posibles numeraciones de identidad y donde se sabe que en la posición 10 de la numeración se encuentra el dato de si es Masculino o Femenino a partir de si es par es Masculino y si es impar es Femenino puede ser la siguiente:

Selecciones los 10 primeros registros a partir de la tabla de trabajadores y conociendo los números de identificación diga si son M o F.

SELECT idnum, nombre,

CASE CAST (SUBSTR(idnum,10,1) AS INTEGER ) % 2

WHEN 0 THEN 'HOMBRE'

WHEN 1 THEN 'MUJER'

END AS sexo

FROM TRABAJADORES

LIMIT 10;


Volviendo a sintaxis más sencillas para no perder neuronas con funciones de carácter un poco más complejos vamos a terminar con la misma cláusula que comenzamos pero profundizando un poquito más en la misma. Es decir hasta el momento hemos empleado los comandos de PostgreSQL para recuperar y mostrar información almacenada en una tabla de la base de datos. Pero en todos los casos la información ha estado desorganizada. En SQL es posible hacer una consulta indicando que los resultados queden ordenados atendiendo a un determinado criterio. Dicho de manera más práctica, es posible recuperar datos y mostrarlos ordenados por una o más columnas.

Por ejemplo: Queremos obtener el listado de todos los trabajadores pero mostrarlo ordenado alfabéticamente por el nombre.

SELECT 

nombre,

apellido1,

apellido2

FROM TRABAJADORES

ORDER BY nombre;


Bueno colegas con este ejemplo un poco más sencillo cerramos por ahora exhortándolos a profundizar un poco más en las consultas y estudiando sus funciones más potentes, síganos en próximos artículos.

{ Leer Más }


jueves, 6 de junio de 2013

Las principales características y avances de PostgresSQL.

clip_image002

En el artículo anterior vimos la Introducción sobre Postgres y su evolución, a continuación queremos mostrarles las principales características que definen a postgresSql como uno de los gestores de base de datos de la más alta calidad y usabilidad para soportar cualquier variedad de proyectos, y sin dudas la base de datos más importante del mundo del software libre y una de las más importantes del mundo en general.

 

  • Es un Gestor de datos Objeto-Relacional

Postgresql organiza los datos con un modelo objeto-relacional, es capaz de manejar procedimientos, rutinas complejas, y reglas. Ejemplos de su funcionalidad avanzada son consultas declarativas SQL, control de versiones múltiples concurrentes, soporte multiusuario, transacciones de dos fases, optimización de consultas, herencia de datos, arreglos y matrices multidimensionales.

 

  • Altamente Extensible

Postgresql soporta operadores, funciones, métodos de acceso y tipos de datos declarados por el usuario. Soporta también sobrecarga de operadores, sobrecarga de procedimientos, vistas materializables y particionamiento de tablas y datos.

 

  • Soporte comprensivo de SQL

Postgresql soporta la especificación base SQL99, SQL:2003 y también incluye características avanzadas como las uniones SQL92.

 

  •  Integridad Referencial

Postgresql soporta integridad referencial, la cual es usada para asegurar la validez de la información dentro de la base de datos.

 

  •  API sumamente flexible

La flexibilidad del API de PostGreSQL ha permitido a entidades que provean soporte de fácil desarrollo para la base de datos de PostGreSQL. Estas interfaces incluyen Object Pascal, Python, Perl, PHP, ODBC, Java/JDBC, Ruby, TCL, C/C++, Pike y una larga lista más de muchos más.

  • Lenguajes Procedimentales

PostGreSQL tiene soporte para lenguajes internos procedimentales, incluyendo un lenguaje ativo llamado PL/pgSQL. Este lenguaje es comparable con el lenguaje procedimental de Oracle, PL/SQL. Otra ventaja de PostGreSQL es la capacidad de usar PERL, Pitón, TCL, Ruby,

PHP, Shell Scripting, etc.; como lenguajes procedimentales internos e integrados.

 

  •  MVCC

MVCC, o control de versiones múltiples concurrentes, es la tecnología que PostGreSQL usa para evitar los seguros (locking) innecesarios. Si usted ha usado cualquier otro gestor de base de datos SQL, como MySQL, MS SQL Server, Sybase ASE, etc.; se ha podido dar cuenta que

existen veces cuando la lectura de un cliente tiene que esperar para accesar a la información en la base de datos. La espera es causada por los clientes que están escribiendo registros e información en la base de datos. En pocas palabras, los clientes que leen son bloqueados por los otros clientes que escriben o actualizan registros en la base de datos. Usando MVCC, PostGreSQL evita este problema de manera definitiva. MVCC es considerado mucho mejor que los seguros a nivel de registros (row level-locking), debido a que el lector nunca es bloqueado por el escritor. En vez de eso, PostGreSQL mantiene un registro de todas las transacciones ejecutadas por los usuarios de la base de datos. PostGreSQL es entonces capaz de manejar registros sin hacer esperar a la gente a que los registros estén disponibles.

 

  •  Cliente / Servidor

PostGresSQL usa una arquitectura cliente / servidor basada en un proceso por usuario. Esto es similar al proceso que utiliza el servidor web Apache para el manejo de procesos. Existe un proceso maestro que se desprende para proveer conexiones adicionales por cada cliente que se intenta conectar a PostGreSQL.

 

  •  Write Ahead Logging (WAL)

La característica de PostGreSQL conocida como Write Ahead Logging incrementa la confiabilidad de la base de datos registrando los cambios antes de ser escritos a la base de datos. Esto asegura que, en caso de ocurrir un fallo critico en la base de datos, existirá un registro de transacciones del cual se pueda restaurar. Esto puede ser de gran beneficio en caso de cualquier fallo, como cualquier cambio que no haya sido totalmente escrito a la base de datos pueden ser recuperados usando los datos que fueron registrados anteriormente. Una vez el sistema es restaurado, el usuario puede continuar con su trabajo justo a partir del momento antes ocurrir el fallo.

Los esperamos en próximas entradas.

{ Leer Más }


jueves, 16 de mayo de 2013

CodeIgniter y el Modelo Vista Controlador

Cuando se desea desarrollar un sistema informático, ya sea de mediana o gran envergadura, se impone utilizar alguna metodología de desarrollo, y poner en práctica patrones arquitectónicos y de software. Los patrones son modelos de diseño y desarrollo propuestos debido a la cantidad de aplicaciones informáticas que tienen características similares, y basados en experiencias y buenas prácticas de desarrolladores de todos los tiempos.

En el desarrollo web, uno de los patrones de uso recurrente es el patrón arquitectónico Modelo-Vista-Controlador[1] (MVC, del inglés Model-View-Controller ), el cual separa la lógica de la aplicación de su representación al usuario y la comunicación al modelo, como se representa en la figura 1.

clip_image002

Figura 1 Representación del patrón de arquitectura Modelo-Vista-Controlador (MVC).

Para este patrón la Vista es la representación de todos los elementos de interacción con los usuarios, es decir, la página web visualizada en el navegador del usuario, con los componentes de formularios, etc. El Modelo encierra las funcionalidades para interactuar con los datos, generalmente de tipo persistente, en este caso, en esta capa se ubican las funciones de interacción con la base de datos. El Controlador por su parte, maneja las entradas de la Vista, abstrayendo su procesamiento para finalmente aplicar los cambios en el modelo. Esto permite hacer cambios en el control sin afectar los elementos que conforman la Vista y el Modelo.

En otras palabras, un código como el siguiente no debería estar en un único fichero.php. Fíjese que he capturado un valor de la vista, he consultado la base de datos y he mostrado los resultados, todo en un mismo segmento de código:

<?php
$connection = pg_connect("dbname=usurios port=5432 user=postgres password=postgres");

$name = $_POST['userName'];
$sentence = "select * from usuarios where nombre = '".$name."'";
$query = pg_Exec($connection, $sentence);
$num_rows = pg_num_rows($query);

echo '<span style="font-weight: bold;"> Se encontraron '.$num_rows.' usuarios con ese nombre.</span>';
?>

Según el MVC debería existir un modelo que haga la consulta, una vista que muestre el resultado, y un controlador que capture el post de la vista, pase el valor al modelo, reciba el resultado de la consulta y la pase a la vista para ser mostrado.

Pues bien, el CodeIgniter (un framework o conjunto de herramientas para desarrollo de sitios web usando PHP), permite no solo desarrollar proyectos mucho más rápido que lo que podría hacer si escribiera el código desde cero, sino que además se basa en el modelo-vista-controlador, permitiendo una buena separación entre lógica y presentación, y permitiendo que las páginas web contengan un mínimo de codificación. En CodeIgniter las clases del modelo no son requeridas.

Veamos el ejemplo anterior, pero usando clases de CodeIgniter, en tres ficheros diferentes:

//en el fichero users_model.php
class Users_model extends Model {
function get_users_quantity($name)
{
$this->db->where('nombre', $name);
$query = $this->db->get('usuarios');

return $query->num_rows();
}

}

 

//en el fichero users.php
class Users extends Controller {
function quantity()
{
$name = $this->input->post('userName');
$this->load->model('users_model');
$data['quantity'] = $this->users_model-> get_users_quantity($name);
$this->load->view('public_view', $data);
}

}

 

//en el fichero public_view.php


echo '<span style="font-weight: bold;"> Se encontraron '.$quantity.' usuarios con ese nombre.</span>';



Bueno, hemos dividido el código en tres partes correspondientes al modelo, al controlador y a la vista. Como pueden ver, en la clase Users_model se hace la consulta a la base de datos; la clase controladora Users actúa como interfaz entre el modelo y la vista, pidiendo al modelo un resultando y cargando la vista, a la cual se le pasa el quantity dentro del arreglo data; y en el fichero public_view.php correspondiente a la vista se muestran los resultados, con una total abstracción de la lógica de control y la interacción con la base de datos.

Con esta arquitectura, nunca verás una página .php en la barra de direcciones de tu navegador, sino el nombre del controlador y la función, por ejemplo, el caso anterior sería accesible por la dirección:

http://sitio/users/quantity

Los ficheros con las clases deben ser colocadas en carpetas específicas dentro del directorio del sitio de CodeIgniter, como se muestra en la figura 2.

clip_image002[4]

Figura 2 Estructura de carpetas de CodeIgniter.

Bueno, en este artículo he comentado las ventajas de usar Codeigniter para proyectos web medianos y grandes, donde es necesario mantener una organización del código y una estructura que garantice rapidez y seguridad, así como la comodidad que brinda para implementar nuestro sitio siguiendo la arquitectura MVC. En próximos artículos comentaré otras ventajas de usar CodeIgniter.





[1] Bahsoon, R. y W Emmerich: Evaluating software architectures: development, stability and evolution. Julio 2003


{ Leer Más }


viernes, 10 de mayo de 2013

Introducción sobre Postgres, su evolución.

¿Qué es postgres?

Los sistemas de mantenimiento de Bases de Datos relacionales tradicionales (DBMS,s) soportan un modelo de datos que consisten en una colección de relaciones con nombre, que contienen atributos de un tipo específico. En los sistemas comerciales actuales, los tipos posibles incluyen numéricos de punto flotante, enteros, cadenas de caracteres, cantidades monetarias y fechas. Está generalmente reconocido que este modelo será inadecuado para las aplicaciones futuras de procesado de datos. El modelo relacional sustituyó modelos previos en parte por su "simplicidad espartana". Sin embargo, como se ha mencionado, esta simplicidad también hace muy difícil la implementación de ciertas aplicaciones. Postgres ofrece una potencia adicional sustancial al incorporar los conceptos de: clases, herencia, tipos y funciones en los que los usuarios pueden extender fácilmente el sistema. Además incorpora características esenciales como son:

  • Restricciones (Constraints)
  • Disparadores (triggers)
  • Reglas (rules)
  • Integridad transaccional

Postgres es un sistema de gestión de bases de datos objeto-relacional, de propósito general, multiusuario y de código abierto, debido a las características antes mencionadas que la colocan en este peldaño tan alto en el mundo de las base de datos. Sus versiones son liberadas bajo la licencia BSD y está diseñado para ambientes de misión crítica. Postgres tiene algunas características que son propias del mundo de las bases de datos orientadas a objetos. De hecho, algunas Bases de Datos comerciales han incorporado recientemente características en las que Postgres fue pionera.


Evolución

clip_image002

Ingris

Desarrollado en la Universidad de California entre 1977 y 1985. Fue mejorado por la Corporación Ingres, siendo uno de los primeros servidores de bases de datos relacionales comercialmente exitosos.

Postgres

Resultado de un estudio realizado a Ingres.

  • Tenía características únicas, comparadas con los servidores de bases de datos de aquellos días:
  • Soporte de arreglos.
  • Sistema de tipos de datos expansible.
  • Bases de datos activas basada en reglas.
  • Fue descontinuado en la versión 4.2.

Postgres95

  • El código fuente fue modificado y SQL fue añadido.
  • El lenguaje de consultas fue cambiado de Postquel a SQL.
  • El tamaño del programa fue reducido por reestructuración del código fuente en un 25%.
  • El programa fue recodificado en C, de acuerdo al estándar ANSI C.
  • El rendimiento fue mejorado (30-50% más rápido que Postgres 4.2).

PostgresSQL

  • Refleja la relación entre Postgres y sus características SQL.
  • La comunidad de PostgreSQL, llamada Grupo Global de Desarrollo de PostgreSQL, fue organizada en Internet en 1996, con un portal en la dirección www.postgresql.org.
  • La primera versión fue liberada en enero de 1997.

En 1996, se hizo evidente que el nombre “Postgres95” no resistiría el paso del tiempo. Por lo que se eligió un nuevo nombre, PostgreSQL, para reflejar la relación entre el Postgres original y las versiones más recientes con capacidades SQL. Al mismo tiempo se comienza a partir de la 6.0, volviendo a la secuencia seguida originalmente por el proyecto Postgres.

Durante el desarrollo de Postgres95 se hizo hincapié en identificar y entender los problemas en el código del motor de datos. Con PostgreSQL, el énfasis ha pasado a aumentar características y capacidades, aunque el trabajo continúa en todas las áreas.

Espérenos en un próximo artículo para que conozca ¨Las principales características y avances de PostgresSQL…¨

{ Leer Más }


martes, 9 de abril de 2013

Introducción al acceso a las bases de datos en JAVA. Patrones y buenas prácticas.

La mayoría de los proyectos actuales necesitan guardar o consultar datos de una base de datos relacional, de esta manera se puede persistir la información de sus usuarios y del negocio que implementan pudiendo acceder a ella en cualquier momento.

Para conectarse a las BD las aplicaciones utilizan por lo general drivers, que no son más que componente que permiten realizar una conexión amigable con la base de datos de un tipo específico. Algunos de estos tipos pueden ser MSSQL, MySQL, Oracle, PostgreSQL, etc.

Otro elemento importante a tener en cuenta es que para realizar operaciones sobre los datos se necesita de un lenguaje de consultas que permita a los desarrolladores trabajar con las bases de datos, y en este punto contamos con SQL.

Aquellos desarrolladores con poca formación o que desconozcan los patrones de diseño existentes puede ser que comentan el error de mezclar el código de la aplicación que desarrolla con el código del acceso a los datos y esto puede traer muchos problemas a corto, mediano y largo plazo. Es por esta razón que se han propuesto arquitecturas y patrones de diseño que especifican cual debe ser la forma de diseñar una aplicación y como una aplicación debe acceder a sus datos. Esto se muestra en las siguientes dos imágenes a manera de ejemplo.

Fig.1 Elementos que componen una arquitectura Modelo Vista Controlador o MVC.

En esta propuesta de arquitectura los elementos que son modelos tienen la responsabilidad de gestionar el acceso a los datos, por lo que el resto de los componentes que son vistas o controladores no tienen que preocuparse de este asunto.


Fig.2 elementos que componen una arquitectura en 3 Capas.

En este caso  la capa inferior se encarga de contener los componentes de acceso  a los datos y sistemas externos por lo que las capas superiores se abstraen de estas responsabilidades.

Como pueden ver en las imágenes  en cada propuesta se establece una separación lógica entre el código de la aplicación y el código del acceso a datos. Esto  hace posible que:
  1. Se pueda cambiar el tipo de base de datos. Ejemplo pasar de MySQL a PosgreSQL con poco cambio sin afectar el código de la aplicación.
  2. Se pueda realizar modificaciones en la estructura o diseño base de datos llevando al mínimo los cambios en la aplicación.
Otro elemento a considerar es cómo se puede combinar la programación Orientada a Objetos donde todo son clases, objetos y componentes con el acceso a datos donde todo son consultas estructuradas, tablas y tuplas de datos. En la búsqueda de una solución a este asunto se llegó a un patrón de diseño conocido como “Mapeo Objeto Relacional” u ORM por sus siglas en inglés que establece una relación entre las tablas de una base de datos y las clases entidades de una aplicación. Para simplificar este patrón diremos que la solución que propone es tener una clase entidad por cada tabla de la base de datos a la que queramos acceder. Esta clase y la tabla se consideran isomorfos o sea, tienen la misma estructura, por cada columna de la tabla se tendrá un atributo en la clase. Además La clase contendrá todo el código encargado de manejar las consultas SQL de forma que el resto de la aplicación no tenga que tratar con consultas SQL cuando se quiera manejar los datos, este código estará dentro de los métodos de la clase que se mapearán contra las operaciones que se deseen realizar sobre la base de datos.
JAVA como lenguaje primero hizo uso de JDBC para el acceso a las BD. Con esta tecnología se puede:
  1. Establecer una conexión con la BD, especificando un driver y los parámetros para autenticarse en la BD.
  2. Usar la conexión establecida para realizar operaciones sobre la BD (seleccionar datos, insertar, modificar, eliminar, etc).
  3. Procesar los resultados devueltos por las operaciones anteriores.
Esta tecnología tiene sus limitaciones y ha sido sustituida en proyectos de desarrollo de aplicaciones empresariales que usan JAVA por una implementación del patrón ORM que se ha constituido el framework por defecto cuando se va a desarrollar una aplicación JAVA con acceso a bases de datos relacionales. Estoy hablando de Hibernate. Si a eso le sumamos el uso del estándar JPA con anotaciones ya se completa la solución para el acceso a bases de datos relacionales.

Fig. 3 Ejemplos de frameworks ORM que usan JDBC.

Este es solo una entrada introductoria a otras que tratarán temas como:
  • Uso de Maven para la gestión de dependencias en proyectos JAVA.
  • Acceso a bases de datos relacionales con JDBC, Hibernate, JPA, a través de servicios RESTful, etc.
  • Uso del Spring Framework, y todos sus componentes, en el desarrollo de aplicaciones JAVA.
  • Uso de ZKoss y Vaadin para el desarrollo de la capa de presentación en aplicaciones empresariales.
{ Leer Más }


IconIconIcon