Mostrando entradas con la etiqueta PostgreSql. Mostrar todas las entradas
Mostrando entradas con la etiqueta PostgreSql. Mostrar todas las entradas

martes, 4 de enero de 2011

PostgreSql: Interfaces de conexión y lenguajes de programación

Con esta publicación se intenta proveer una guía inicial en cuanto a la conectividad de PostgreSql y algunos lenguajes de programación. Los ejemplos han sido probados en linux Debian (a menos que se indique lo contrario), pero debe de funcionar normalmente en cualquier otra distribución, solo instalando los paquetes equivalentes.

¿Cómo conectarse desde JAVA via JDBC?

Requisitos:


jurasec@dev:~/test$ CLASSPATH=.:postgresql-8.4-702.jdbc3.jar 

Ejemplo
import java.sql.*;
public class Conexion {
 public static void main(String args[]) {
  Connection conn;
  Statement stat;
  ResultSet rset;

  try{
   Class.forName("org.postgresql.Driver");
   conn=DriverManager.getConnection("jdbc:postgresql:test","postgres","postgres");
   stat=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);

    rset = stat.executeQuery("SELECT id,descripcion FROM articulos");
   while (rset.next()) {
    System.out.println(rset.getString(1)+" - "+rset.getString(2));
   }
   rset.close();
   stat.close();      

  }catch(Exception e){
   System.out.println("Error: "+e.getMessage());
  }
 }
}

¿Cómo conectarse a C# con (Npgsql)?

Este ejemplo ha sido probado sobre Windows con .NET y en Linux con Mono
Requisitos:


Ejemplo
using System;
using System.Data;
using Npgsql;
 
public class Conexion{
 public static void Main(string[] args){
  string connectionString =
   "Server=localhost;" +
   "Database=test;" +
   "User ID=postgres;" +
   "Password=postgres;";
  IDbConnection dbcon;
  dbcon = new NpgsqlConnection(connectionString);
  dbcon.Open();
  IDbCommand dbcmd = dbcon.CreateCommand();

  string sql = "SELECT id,descripcion FROM articulos";
  dbcmd.CommandText = sql;
  IDataReader reader = dbcmd.ExecuteReader();
  while(reader.Read()) {
   int id = reader.GetInt32(reader.GetOrdinal("id"));
   string descripcion = reader.GetString(reader.GetOrdinal("descripcion"));
   Console.WriteLine(id + " - " + descripcion);
  }

  reader.Close();
  reader = null;
  dbcmd.Dispose();
  dbcmd = null;
  dbcon.Close();
  dbcon = null;
 }
}

Compilando el ejemplo:
gmcs Conexion.cs -r:System.Data.dll -r:Npgsql.dll
 

Para ejecutarlo:
mono Conexion.exe
 

¿Cómo conectarse desde PHP?

Requisitos:

  • Instalar php5-pgsql

Ejemplo
$dbconn = pg_connect("host=localhost dbname=test user=postgres password=postgres")
    or die('No se pudo conectar: ' . pg_last_error());

$query = 'SELECT id,descripcion FROM articulos';
$result = pg_Exec($query) or die('Error: ' . pg_last_error());

echo "\n";
while ($line = pg_fetch_object($result)) {
    echo "\t\n";
    foreach ($line as $col_value) {
        echo "\t\t\n";
    }
    echo "\t\n";
}
echo "
$col_value
\n"; pg_free_result($result); pg_close($dbconn);

¿Cómo conectarse desde Python 2.x  (psycopg2)?


Requisitos:

  • Instalar python-psycopg2

Ejemplo
import psycopg2
try:
 con = psycopg2.connect("host=localhost dbname=test user=postgres password=postgres")
 cursor = con.cursor()
 cursor.execute("select id,descripcion from articulos")
 for row in cursor:
  id,descripcion=row
  print id,descripcion

 cursor.close()
 con.close()
except:
 print "Error"

¿Cómo conectarse desde Python 3 (psycopg2)?


Requisitos:


python3 setup.py install

Ejemplo
import postgresql
try:
 db = postgresql.open("pq://postgres:postgres@localhost/test")
 ps = db.prepare("SELECT id,descripcion from articulos")
 for row in ps:
  id,descripcion=row
  print (id,descripcion)
except:
 print ("Error")

¿Cómo conectarse desde C?


Requisitos:

  • Instalar postgresql-server-dev-8.4

Ejemplo
#include <stdio.h>
#include <libpq-fe.h>

int main(){
 PGconn *conn;
 PGresult *res;
 int i,j;

 conn = PQsetdbLogin("localhost","5432",NULL,NULL,"test","postgres","postgres");
 
 if (PQstatus(conn) != CONNECTION_BAD){
  res = PQexec(conn, "select id,descripcion from articulos");
  if (res != NULL && PGRES_TUPLES_OK == PQresultStatus(res)){
   for (i = 0; i < PQntuples(res); i++){
    for (j = 0; j < PQnfields(res); j++)
     printf("%s\t",PQgetvalue(res,i,j));
    printf("\n");
   }
   PQclear(res);
  }
 }
 else
  printf("Error");
 
 PQfinish(conn);
 return 0;
}

Compilando el ejemplo:
gcc db.c -o db -lpq -I/usr/include/postgresql/

¿Cómo conectarse desde Perl?

Requisitos:

  • Instalar libdbi-perl

Ejemplo
#!/usr/bin/perl
use DBI;
#use strict;
my $dbh = DBI->connect("DBI:Pg:dbname=test;host=localhost", "postgres", "postgres");
$dbh->{RaiseError} => 1; #ref

my $sth = $dbh->prepare("SELECT id,descripcion FROM articulos");
$sth->execute();
 
while(my $ref = $sth->fetchrow_hashref()) {
   print "$ref->{'id'} - $ref->{'descripcion'}\n";
}
$sth->finish;
$dbh->disconnect;
exit;

¿Cómo conectarse desde Ruby on Rails? 

Requisitos:

  • Instalar libdbd-pg-ruby1.8 
Creamos nuestra aplicación de prueba
rails -d postgresql test_app
Editamos el archivo config/database.yml con los parámetros necesarios para la conexión con Pgsql
development:
  adapter: postgresql
  database: test
  username: postgres
  password: postgres
  host: localhost
Generamos el controlador y el modelo necesario:
ruby1.8 script/generate controller Articulo
ruby1.8 script/generate model Articulo
Creamos la base necesario para poder ver, crear, actualizar y eliminar los datos de la tabla Articulos
class ArticuloController < ApplicationController
 scaffold :articulo
end
Veamos el resultado en http://0.0.0.0:3000/articulo

 Los siguientes ejemplos estan probados en Windows Xp, Vista, 7

 ¿Cómo conectarse desde Visual Basic 6 (ADO)? 

 Requisitos:


Ejemplo
Set cn = CreateObject("ADODB.Connection")
cn.Open "Driver={PostgreSQL ANSI};SERVER=localhost;DATABASE=test;PORT=5432;UID=postgres;PWD=postgres;"

Set rs = CreateObject("ADODB.Recordset")
rs.Open "SELECT id,descripcion FROM articulos", cn

Do Until rs.EOF
   Debug.Print rs!id, rs!descripcion
   rs.MoveNext
Loop
¿Cómo conectarse desde Visual FoxPro?

Requisitos:


Ejemplo
strConnection = 'DRIVER={PostgreSQL Ansi};SERVER=localhost;'+;
        'PORT=5432;DATABASE=test;'+;
        'UID=postgres;' +;
        'PWD=postgres;'

SQLSETPROP(0,'DispLogin',3) && evita que aparezca el login del DSN ODBC
conn  = SQLSTRINGCONNECT(strConnection,.F.) 

IF conn = -1
 AERROR(arrayerror)
 IF arrayerror(4)='28000' THEN 
  MESSAGEBOX('Usuario y/o contraseña incorrectos',16,'Error')
 ENDIF 
ELSE
 MESSAGEBOX('Conectado')
 ssql="select id,descripcion from articulos"
 status = SQLEXEC(conn,ssql,'cCursor')
 IF status=-1
  MESSAGEBOX('Error en la consulta')  
  RETURN 
 ELSE
  select cCursor
  browse
 ENDIF 
ENDIF

¿Cómo conectarse desde Access?


Requisitos:

Creamos una base de datos vacía.

Elegimos importar base de datos ODBC.


Elegimos la vinculación de datos.

Creamos un nuevo origen de datos, seleccionando PostgreSql.

Configuramos origen de datos.

 Guardamos el origen configurado y luego se selecciona de la lista.

Se seleccionan las tablas que se desean vincular.

Resultado.



lunes, 4 de octubre de 2010

Another PostgreSQL Diff Tool: Comparación de esquemas en PostgreSql.

Esta utilidad nos ayuda en la tarea de actualización de esquemas, la cual lo hace mediante la comparación de dos archivos de la estructura de la base de datos, como resultado se obtiene las sentencias necesarias (DDL) para actualizar la base antigua.

Another PostgreSQL Diff Tool (apgdiff), esta escrito en Java, es una aplicación para la linea de ordenes, su versión actual es la 2.2.1 y su tipo de licencia es MIT.

Su sintaxis de uso es:
java -jar apgdiff-<version> [options] <old_dump> <new_dump>
Básicamente necesita dos parámetros para ejecutarse, el primero es el dump del esquema de la base de datos original (podria ser la que esta en producción), el segundo es el dump del esquema de la nueva base de datos (la de desarrollo).

Ejemplo de uso:
jurasec@jurasec:~$ apgdiff test_produccion.sql test_desarrollo.sql

CREATE SEQUENCE clientes_id_seq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;

CREATE TABLE clientes (
id integer DEFAULT nextval('clientes_id_seq'::regclass) NOT NULL,
descripcion text,
contacto text
);

ALTER TABLE articulos ADD COLUMN fecha_registro timestamp without time zone DEFAULT now();

ALTER TABLE clientes ADD CONSTRAINT clientes_pkey PRIMARY KEY (id);

La base de datos original solo tienen una tabla:
CREATE TABLE articulos (
    id integer NOT NULL,
    descripcion text,
    precio numeric(15,2)
);

ALTER TABLE articulos ALTER COLUMN id SET DEFAULT nextval('articulos_id_seq'::regclass);
La salida puede ser redireccionada a un archivo:
jurasec@jurasec:~$ apgdiff test_produccion.sql test_desarrollo.sql > test_ddl_diff.sql
Apgdiff no soporta todas las sentencias DDL actualmente (por ejemplo los parametros SET, GRANT, REVOKE, CREATE TYPE, ALTER SEQUENCE, etc), por lo tanto hay que tener en cuenta cuales son las que si están soportadas, para evitar cualquier tropiezo. Puedes usar la opción --output-ignored-statements, para ver que sentencias fueron ignoradas por apgdiff al crear el archivo de las DDL de actualización.

Para Debian, Ubuntu y Gentoo, existen paquetes para instalarlo directamente desde sus repositorios, también puede ser descargado desde sourceforge.

Para más información visitar su página.

jueves, 30 de septiembre de 2010

Como dar formato de moneda a un número en PostgreSql.

Para mostrar el formato deseado usaremos to_char, dicha función es muy buena para dar diferentes tipos de formatos a un valor, gracias a los patrones que se pueden aplicar.
Bueno la idea es que teniendo un número como 3456789, obtengamos $3,456,789.00

test@[local]=# select to_char(3456789,'LFM9,999,999.00') as formato;
    formato   
---------------
 $3,456,789.00
(1 fila)

Duración: 0.483 ms

El modificador L agrega el símbolo de moneda (este dependiendo de las locales configuradas).
El prefijo FM (Fill Mode) hace que se eliminen los ceros y espacios en blanco, pero no funciona si en lugar de 9 se escriben 0, por eso al final la cadena de formato termina con *.00, no con 9, de lo contrario se obtendría:

test@[local]=# select to_char(3456789,'LFM9,999,999.99') as formato;
   formato 
-------------
 $3,456,789.
(1 fila)

Duración: 0.451 ms

miércoles, 7 de abril de 2010

Configuración de nail para el envío de correos mendiante gmail

Debido a la tediosa y necesaria tarea de hacer respaldos de las bases de datos, cree un script sumamente sencillo que hiciera la labor. Para ello, instale nail como cliente de correo (el servidor tiene Ubuntu Hardy 8.04 LTS );

sudo apt-get install nail (si que me costo)

Posteriormente, hay que agregar unas lineas al archivo de configuración ubicado en /etc/nail.rc
set smtp=smtp://smtp.gmail.com:587
set smtp-use-starttls
set smtp-auth=login
set ssl-verify=ignore
set smtp-auth-user=[usuario]@gmail.com
set smtp-auth-password=[contraseña]
Probando configuración:

echo "mensaje mensaje mensaje mensaje" | nail -s "asunto" [usuario_destino]@[servidor].com

Ya teniendo nail listo, y el script que hace los respaldos, programé la tarea para que se ejecute dos veces por día. El script el cual hace el respaldo de dos bases de datos y de los roles quedó de la siguiente manera;