3.4. Proceso por lotes y formatos de salida

3.4. Proceso por lotes y formatos de salida Dataprix 20 Octubre, 2009 - 11:54

Además de ser interactivo, psql puede procesar comandos por lotes almacenados en un archivo del sistema operativo mediante la siguiente sintaxis:

$ psql demo -f demo.psql

 

Aunque el siguiente comando también funciona en el mismo sentido, no es recomendable usarlo porque de este modo, psql no muestra información de depuración importante, como los números de línea donde se localizan los errores, en caso de haberlos:

 

$ psql demo < demo.psql

El propio intérprete psql nos proporciona mecanismos para almacenar en fichero el resultado de las sentencias:

* Hemos almacenado el resultado     en el fichero ‘/tmp/a.txt’.                     

•    Especificando el fichero destino* directamente al finalizar una sentencia:

demo=# select user \g /tmp/a.txt

 

•    Mediante una pipe enviamos la salida a un comando Unix:

Notación                                               
A la orden ‘\o’ se le debe espe- cificar un fichero o bien un co- mando que irá recibiendo los resultados mediante una pipe.
Cuando se desee volver a la salida estándar STDOUT, simplemente se dará la orden ‘\o’ sin ningún parámetro.

demo=# select user \g | cat > /tmp/b.txt

•    Mediante la orden ‘\o’ se puede indicar dónde debe ir la salida de las sentencias SQL que se ejecuten en adelante:

demo=# \o /tmp/
sentencias.txt demo=# select
user;
demo=# select 1+1+4;
demo=# \o
demo=# select 1+1+4;
   ?column?
  ----------
     6
  (1 row)
demo=#

•    Se puede solicitar la ejecución de un solo comando y terminar inmediatamente mediante la siguiente forma:

La salida del fichero                           
Al haber especificado que se quiere la salida en html, la podríamos redirigir a un fichero (ya hemos visto cómo hacerlo) y generar un archivo html que permitiese ver el resultado de la consulta mediante un navegador web convencional

$ psql -d demo -c "comando"

•    Se puede especificar el formato de salida de los resultados de una sentencia.
Por defecto, psql los muestra en forma tabular mediante texto. Para cambiarlo, se debe modificar el valor de la variable interna ‘format’ mediante la orden

'\pset'. Veamos, en primer lugar, la especificación del formato de salida:
demo=# \pset format html
Output format is html.
demo=# select user;
<table><tr><th>current_user</th><th>
   </th></tr><tr></tr><tr><td>postgres</td><td>
    </td></tr><tr><table><p>(1 row)
  </p>
demo=#

<p> </p>
<p>Hay otros formatos de salida, como ‘aligned’, ‘unaligned’, ‘html’ y ‘latex’. Por defecto, psql muestra el resultado en formato ‘aligned’.
 </p>
<table><tbody><tr><td>La salida de este fichero                      </td>
        </tr><tr><td>Con esta configuración, y diri- giendo la salida a un fichero, generaríamos un fichero CSV listo para ser leído en una hoja de cálculo u otro programa de importación de datos.</td>
        </tr></tbody></table><p>
Tenemos también multitud de variables para ajustar los separadores entre columnas, el número de registros por página, el separador entre registros, título de la página html, etc. Veamos un ejemplo:

<code>
demo=# \pset format
unaligned Output format is
unaligned. demo=# \pset
fieldsep `,´ Field separator
is ``,´´.
demo=# select user, 1+2+3 as resultado;
current_user,resultad
o postgres,6
(1 row)
demo=#

Para poder realizar los ejemplos del resto del presente apartado, se debe procesar el contenido del fichero demo.sql tal como se transcribe a continuación.

Contenido del fichero demo.psql

--drop table productos;
--drop table proveedores;
--drop table precios;
--drop table ganancia;
create table productos (
parte                 varchar(20),
tipo                  varchar(20),
especificación        varchar(20),
psugerido             float(6),
clave                 serial,

primary key(clave)
);

insert into productos (parte,tipo,especificación,psugerido) values
  (`Procesador´,´2 GHz´,´32 bits´,null);
insert into productos (parte,tipo,especificación,psugerido) values
  (`Procesador´,´2.4 GHz´,´32 bits´,35);
insert into productos (parte,tipo,especificación,psugerido) values
  (`Procesador´,´1.7 GHz´,´64 bits´,205);
insert into productos (parte,tipo,especificación,psugerido) values
  (`Procesador´,´3 GHz´,´64 bits´,560);
insert into productos (parte,tipo,especificación,psugerido) values
  (`RAM´,´128MB´,´333 MHz´,10);
insert into productos (parte,tipo,especificación,psugerido) values
  (`RAM´,´256MB´,´400 MHz´,35);
insert into productos (parte,tipo,especificación,psugerido) values
  (`Disco Duro´,´80 GB´,´7200 rpm´,60);
insert into productos (parte,tipo,especificación,psugerido) values
  (`Disco Duro´,´120 GB´,´7200 rpm´,78);
insert into productos (parte,tipo,especificación,psugerido) values
  (`Disco Duro´,´200 GB´,´7200 rpm´,110);
insert into productos (parte,tipo,especificación,psugerido) values
  (`Disco Duro´,´40 GB´,´4200 rpm´,null);
insert into productos (parte,tipo,especificación,psugerido) values
  (`Monitor´,´1024x876´,´75 Hz´,80);
insert into productos (parte,tipo,especificación,psugerido) values
  (`Monitor´,`1024x876´,´60 Hz´,67);
create table proveedores (
   empresa       varchar(20) not null,
   credito       bool,
   efectivo      bool,
   primary key   empresa)
);

insert into proveedores (empresa,efectivo) values (`Tecno-k´, true
); insert into proveedores (empresa,credito) values (`Patito´,
true ); insert into proveedores (empresa,credito,efectivo) values
(`Nacional´, true, true );

create table ganancia(
   venta     varchar(16),
   factor    decimal (4,2)
)

insert into ganancia values(`Al por mayor´,1.05);
insert into ganancia values(`Al por menor´,1.12);

create table precios (
  empresa               varchar(20) not null,
  clave                 int not null,
  precio float(6),

  foreign key (empresa) references proveedores,
  foreign key (clave)   references productos
);

  insert into precios values (`Nacional´,001,30.82);
  insert into precios values (`Nacional´,002,32.73);
  insert into precios values (`Nacional´,003,202.25);
  insert into precios values (`Nacional´,005,9.76);
  insert into precios values (`Nacional´,006,31.52);
  insert into precios values (`Nacional´,007,58.41);
  insert into precios values (`Nacional´,010,64.38);
  insert into precios values (`Patito´,001,30.40);
  insert into precios values (`Patito´,002,33.63);
  insert into precios values (`Patito´,003,195.59);
  insert into precios values (`Patito´,005,9.78);
  insert into precios values (`Patito´,006,32.44);
  insert into precios values (`Patito´,007,59.99);
  insert into precios values (`Patito´,010,62.02);
  insert into precios values (`Tecno-k´,003,198.34);
  insert into precios values (`Tecno-k´,005,9.27);
  insert into precios values (`Tecno-k´,006,34.85);
  insert into precios values (`Tecno-k´,007,59.95);
  insert into precios values (`Tecno-k´,010,61.22);
  insert into precios values (`Tecno-k´,012,62.29);