lunes, 14 de marzo de 2011

Obteniendo comentarios de tablas y columnas - diccionario de datos

Se presentó el típico problema de falta de documentación! Entender un sistema es complejo y paradojicamente, pareciera que cada vez más... Muchas tecnologías, muchos entornos de trabajo, muchas maneras de configurarlos, mucho... Spring, GWT, Hibernate, Symfony, CakePHP, Rails, Struts, etc, etc, etc, etc... Y etc...

Como para rematar, más que un sistema sin documentación, una BD sin ella, es como buscar una aguja en un pajar... Como mínimo deberíamos tener un diccionario de datos y alguno de esos diagramitas (ER - Peter Chen) generados con alguna herramienta CASE.

El problema que persigue a cualquier "UP frutado" y que además haya leído algo con aires del Manifiesto por el Desarrollo Ágil de Software es: si debe generar ese diccionario en un documento que seguramente no será actualizado más nunca en la vida y del que no podrá generarse un artefacto de software.

Idealmente, en un modelo bottom-up, podemos comenzar con un CASE e ir incluyendo los comentarios según realizamos el modelo y al generar nuestro script SQL, pum! Ya tenemos comentarios en BD.

Ahora, todo esto es bello como la pradera, pero mentira como el comercial de Coca-Cola (el de la canción de Oasis, Whatever). Esto seguramente no se actualizará más nunca en la vida.

Con base en todo lo que he mencionado, decidí incluir los comentarios en BD directamente. Y cuando deseo leerlos, pues lo hago con el MySQL Admin.

Ahora, qué pasa si el jefe o alguien no técnico quiere esa info... O simplemente quieres tenerla en otro formato... Precisamente ese fue uno de los problemas con los que me conseguí y realmente MySQL no me daba una herramienta que se adaptara a lo que necesitaba... Les dejo este sencillo script que pretende facilitarles la vida... Por supuesto, se pueden incluir muchas más cosas en la salida:

#!/bin/bash

if [ $# -lt 3 ]; then
        echo "You must specify table, schema and host"
        echo "Eg. script.sh TABLE SCHEMA 192.168.10.1"
        exit
fi

table="$1"
schema="$2"
host="$3"
user="root"

stty -echo
read -p "Enter MySQL's Admin password: " password
stty echo
echo

mysql -u $user --password=$password -h $host --batch information_schema --skip-column-names -e "SELECT table_name, table_comment FROM tables WHERE table_name='$table' AND table_schema='$schema'" | sed 's/\t/|/g'

mysql -u $user --password=$password -h $host --batch information_schema --skip-column-names -e "SELECT column_name, column_type, column_comment FROM columns WHERE table_name='$table' AND table_schema='$schema'" | sed 's/\t/|/g'

El script de arriba imprime campos separados por tuberías "|". Específicamente, nombre de tabla, nombre de columnas, tipos y comentarios. Un ejemplo de salida:

$ ./extractComments.sh mia test localhost 
Enter MySQL's Admin password: 
mia|Descripcion de la tabla
id|int(11)|Descripcion del campo id
name|varchar(50)|

Y puede utilizar esta variante para extraer el "Diccionario de Datos" de toda la BD:

#!/bin/bash

if [ $# -lt 2 ]; then
        echo "You must specify table, schema and host"
        echo "Eg. script.sh SCHEMA 192.168.10.1"
        exit
fi

schema="$1"
host="$2"
user="Admin"

stty -echo
read -p "Enter MySQL's Admin password: " password
stty echo
echo

mysql -u $user --password=$password -h $host --batch $schema --skip-column-names -e "SHOW TABLES" |
while read table; do

  mysql -u $user --password=$password -h $host --batch information_schema --skip-column-names -e "SELECT table_name, table_comment FROM tables WHERE table_name='$table' AND table_schema='$schema'" | sed 's/\t/|/g'

  mysql -u $user --password=$password -h $host --batch information_schema --skip-column-names -e "SELECT column_name, column_type, column_comment FROM columns WHERE table_name='$table' AND table_schema='$schema'" | sed 's/\t/|/g'

  echo; echo
done;


No hay comentarios:

Publicar un comentario en la entrada