martes, 30 de junio de 2009

Trabajando con Netbeans 6.5.1 y Visual Web JSF - Parte 2

Holas a todo@s, bueno aqui va la segunda parte del manual /guia.. mejor me apuro con esto porque ya salio la version 6.7 de Netbeans y derepente ya no sirva mucho esta guia,,jajaja,, no lo creo.. pero siempre hay que estar preparado para algun cambio..

PARTE II. CREANDO LA BASE DE DATOS Y CONECTANDOLA A NUESTRO PROYECTO

1. Crear nuestra base de datos en PostgreSQL.
Usando cualquier Administrador (psql, pgadmin3, pgmanager, etc etc) para PostgreSQL creamos una base de datos que se llame "biblioteca".

2. Haciendo la conexion.
Vamos a netbeans y seleccionamos la ficha Services, alli desplegamos el Nodo Databases -> Drivers, luego hacemos click derecho en sobre PostgreSQL* y escogemos "Connect using..."



*Si no tenemos el driver listado debemos agregarlo, bajando el driver jdbc para PostgreSQL de http://pgfoundry.org/projects/jdbc/ y agregandolo con las opciones que netbeans nos da.

Luego nos aparece la ventana para configurar nuestra conexion usando el driver jdbc de PostgreSQL, asi que solo ponemos lo que corresponda en cada campo, mas o menos como la figura siguiente:


Le damos click en "OK", nos pide escoger el esquema, asi que seleccionamos "public" y hacemos click en "Ok",


con lo que tenemos un nuevo nodo en el arbol bajo Databases.. algo como la figura:


desplegamos el nuevo nodo y veremos 3 carpetas "Tables", "Views" y "Procedures". Hacemos click derecho sobre "Tables" y escogemos la opcion "Create Table"..


nos aparece el formulario de creacion de una nueva tabla, asi que crearemos nuestra tabla que se llame "libros" y con los campos como se muestran en la figura (para agregar un nuevo campo solo debemos hacer click en el boton "Add column"):


Asi podemos crear tambien las otras tablas necesarias para nuestra aplicacion: "usuarios" y "prestamo_de_libros", soy consciente de que no uso ningun estandar de nomenclatura ni que el diseño de la base de datos es el adecuado y bla bla bla.. solo es un EJEMPLO con fines netamente didacticos :o), aun asi recomiendo dar integridad referencial (claves foraneas en la tabla "prestamo_de_libros" con algun otro administrador de PostgreSQL de tal forma que cuando despleguemos el nodo "Foreign keys" de la tabla "prestamo_de_libros" tengamos algo como la figura siguiente:


Bueno para los que deseen solamente crear la base de datos desde cualquier otro medio y empezar a hacer la aplicacion aqui les doy el script de creacion de la base de datos "biblioteca":


CREATE TABLE public.libros (
codigo smallint NOT NULL,
titulo character varying(45),
autor character varying(45),
isbn character varying(45)
) WITHOUT OIDS;
--
CREATE TABLE public.usuarios (
codigo smallint NOT NULL,
nombre character varying(50),
direccion character varying(50),
documento character varying(15),
telefono character varying(15),
fecha_nacimiento date,
sexo character(1)
) WITHOUT OIDS;
--
CREATE TABLE public.prestamo_de_libros (
numero integer NOT NULL,
fecha date NOT NULL,
usuario smallint NOT NULL,
libro smallint NOT NULL,
fecha_de_devolucion date NOT NULL
) WITHOUT OIDS;
--
ALTER TABLE ONLY libros
ADD CONSTRAINT libros_pkey PRIMARY KEY (codigo);
--
ALTER TABLE ONLY usuarios
ADD CONSTRAINT usuarios_pkey PRIMARY KEY (codigo);
--
ALTER TABLE ONLY prestamo_de_libros
ADD CONSTRAINT prestamo_de_libros_pkey PRIMARY KEY (numero);
--
ALTER TABLE ONLY prestamo_de_libros
ADD CONSTRAINT prestamo_de_libros_fk FOREIGN KEY (usuario) REFERENCES usuarios(codigo) ON UPDATE RESTRICT ON DELETE RESTRICT;
--
ALTER TABLE ONLY prestamo_de_libros
ADD CONSTRAINT prestamo_de_libros_fk1 FOREIGN KEY (libro) REFERENCES libros(codigo) ON UPDATE RESTRICT ON DELETE RESTRICT;

3. Enlazando el componente "Table".

Abrimos la pagina "FrmLibros" que hicimos anteriormente, luego vamos a nuestra paleta de componentes y jalamos un componente de tipo "Table" a la pagina,


le cambiamos el titulo a "LIBROS", y quedara algo asi:


luego vamos a la ficha "Services", seleccionamos nuestra tabla "Libros" y con el mouse la arrastramos y soltamos sobre el objeto "Table1" que acabamos de colocar en la pagina "FrmLibros" que tenemos abierta, aqui se puede demorar unos segundos en refrescar, y luego tendremos algo como se muestra:


Con esto se ha enlazado el Table con la tabla Libros de la base de datos. Se pueden dar algunas opciones para personalizar el diseño de la tabla usando la ventana de propiedades o haciendo click derecho sobre la tabla y escogiendo la opcion "Table Layout...". Por ejemplo vamos a corregir los titulos para que esten en mayusculas. Hacemos click derecho sobre Table1, escogemos "Table Layout...":


Alli podemos modificar muchos atributos mas, como alineacion de los datos, ancho de columnas, quitar columnas, agregar, etc etc.


Con esto ya podemos ejecutar "F6" y podremos ver los datos de nuestra tabla Libros.
Bueno dejo esta parte ahi, sino me demorarare mas en publicar.. la proxima si sera el insertar borrar y actualizar datos... y prometo que sera en menos tiempo que este post :o) , ademas revisare la nueva version de Netbeans 6.7, haber que cambios hay para VisualWeb. See yaaa

miércoles, 24 de junio de 2009

Migrando de MSSQL2000 a PostgreSQL8.3 - Conclusiones

Ya termine la migración!!!!.. pero... hubieron cosas y cositas que resolver en el camino... asi queee... que mejor que compartirlas con uds...

Estas son las cosas que pasaron o que siempre se deben tener en consideración al momento de hacer una migración de este tipo:

  • No olvidar la diferencia de mayusculas minusculas, si desean usar Mayusculas o caracteres no ingleses como la ñ o tildes ponerlo siempre entre comillas (").
  • El driver ODBC no puede capturar resultados de cursores; es decir funciones que devuelven tipos cursor o refcursor. Segun algunos se puede usando tres instrucciones:

  
begin;
select * from tufuncion();
fetch all from "nombre del cursor devuelto";

<<<<Yo no lo pude hacer funcionar en VB6 ni en Delphi, asi que use records, el tiempo ya presionaba mucho.

  • El driver OleDB cuando retorna mas de 8000 registros aprox. se vuelve lento muy lento. ODBC es siempre rapido pero hay que definir el record para retornar valores.
  • En Delphi fue muy muy ineficiente usar OleDB asi que alli solo se uso ODBC.
  • La instruccion "exists" en Postgres es muy lenta, en lo posible se debe evitar su uso; siempre hay una forma de evitarla con lefts joins, right joins y esas cosas.
  • No existe la sentencia TOP en Select's, en MSSQL se hace algo como: SELECT TOP 10 * FROM tutabla, en PostgreSQL seria: SELECT * FROM tutabla LIMIT 10 , dicen que tambien se puede usar el atributo 'maxrows' de CFQUERY, pero nunca lo use y no tengo idea a que se refieren :o).
  • La sentencia LIKE diferencia mayusculas y minusculas en postgresql, se puede solucionar con algo como esto: SELECT * FROM tutabla WHERE LOWER(columna) LIKE '%#LCase(var)#%' (O tambien se puedes usar el operador ILIKE).
  • El operador mas (+) no se usa para concatenar, en su lugar se debe usar la barra doble (||), por ejemplo la instrucción en MSSQL SELECT nombre + ' ' + apellido AS nombrecompleto seria SELECT nombre || ' ' || apellido AS nomobrecompleto , la ultima forma es aceptada tambien en MSSQL.
  • Hay muchas otras funciones tambien que no existen en PLPgSQL, pero no es dificil encontrar sus equivalencias, por ejemplo:


month -> date_part
year -> date_part
convert -> to_char, cast, ::
print -> raise notice
isnull -> coalesce
str -> to_char

  • El uso del tipo decimal desde VB a veces funciona y aveces no, el porque..., no lo se, asi que migramos todos los "decimal" a double precision, el problema es que despues hay que formatear las salidas y entradas a la cantidad de decimales que se necesiten.
  • Es importante tambien saber que la logica de manejo de transacciones en las funciones almacenadas en PostgreSQL es diferente que la de MSSQL con los Procedimientos Almacenados, en MSSQL si queremos controlar la correcta ejecucion de tooodo un store con muchas instrucciones debemos indicar explicitamente que queremos que este store este en una transaccion e ir capturando los codigos de error para hacer un rollback, mientras que en PostgreSQL toda funcion almacenada se ejecuta automaticamente dentro de una transaccion, por lo que si falla nuestra funcion en algun punto se hara un rollback automatico.
Ahora si creo que es todo.. Bytes y espero que esto le sirva a alguien mas....

viernes, 12 de junio de 2009

Backup Simple en PostgreSQL usando pg_dump

Holas, bueno este post no es totalmente de mi autoria, pero lo he traducido y lo pongo en mi Blog por si alguien mas lo necesita, hago algunos aportes chiquititos al articulo original, para que se entienda bien en un entorno CentOs 5 y PostgreSQL 8.3
La entrada original en ingles esta en http://www.cyberciti.biz/tips/howto-backup-postgresql-databases.html

PostgreSQL es una de las bases de datos open-source mas robustas que existen. Como muchos otros RDBMS este brinda herramientas para realizar tareas de backup de la data.

Paso# 1: Ingresar al sistema como usuario postgres.

Digite el siguiente comando:
$ su postgres
Obtener la lista(s) de la(s) base de datos a sacar backup:
$ psql -l

Paso# 2: Hacer el backup usando pg_dump

Pg_dump es un utilitario para hacer backups de una base de datos PostgreSQL. Solo se puede hacer backup de una sola base de datos a la vez. Sintaxis general:
pg_dump basededatos > archivodestino

Ejemplo: Hacer backup a una base de datos llamada ventas

Escriba los siguientes comandos
$ pg_dump ventas > ventas.dump.out

Para restaurar la base de datos ventas:
$ psql -d ventas -f ventas.dump.out

O

$ createdb ventas
$ psql ventas

Sin embargo, en un ambiente de produccion siempre necesitaremos comprimir el backup de la base de datos:

$ pg_dump ventas | gzip -c > ventas.dump.out.gz

Para restaurar la base de datos usamos el siguiente comando:

$ gunzip ventas.dump.out.gz
$ psql -d ventas -f ventas.dump.out

Paso# 3: Automatizar el proceso
A continuación veremos un script en bash para realizar dicha tarea automaticamente, y luego los comandos necesarios para ponerlo en el gestor de tareas cron del linux.

Creamos el archivo backup.sh
$ nano backup.sh

Y alli escribimos el codigo siguiente:
#!/bin/bash
DIR=/backup/psql
F=$(date +%Y-%m-%0e)
export PGUSER=postgres
export PGPASSWORD=tupassword
[ ! $DIR ] && mkdir -p $DIR || :
LIST=$(psql -l | awk '{ print $1}' | grep -vE '^-|^Listado|^Nombre|template[0|1]')
#LIST="ventas produccion almacen"
for d in $LIST
do
pg_dump $d | gzip -c > $DIR/$d$F.out.gz
done
unset PGUSER
unset PGPASSWORD

Salimos guardando con Ctrl-X.
Yo reemplazo la variable LIST con los nombres de mis bases que quiero sacar backup, el comando que saca los nombres de las bases de datos en el script no me funciona del todo bien, pero la idea es esa :o).

Luego damos permisos de ejecucion al archivo backup.sh
$ chmod 755 backup.sh

Ingresamos la tarea en el cron.
$crontab -e

Configuro para que todos los dias a la 1am se realice el backup, por lo que escribo (para editar deben usar comandos de vi)
00 01 * * * /var/lib/pgsql/backup.sh

Paso #4:Backup completo de todo el gestor de base de datos.
Otra opcion es usar el comando pg_dumpall. como su nombre lo dice genera un backup de TODA la base de datos, guardando los datos de todo el gestor como usuarios, grupos y privilegios. Se puede usar el comando de la sig. forma:
$ pg_dumpall > all.dbs.out

O

$ pg_dumpall | gzip -c > todo.dbs.out.gz

Para restaurar el backup usamos el siguiente comando:
$ psql -f todo.dbs.out postgres