Interfases de Conexión y Lenguajes de Programación


En esta sección se cubren las distintas opciones de conexión y sus respectivos lenguajes. Para más información ver Documentación y Preguntas Frecuentes

¿Como conectarse a PostgreSQL vía ODBC?

  1. Bajar e instalar el controlador oficial de ODBC para PostgreSQL, ver sección Archivos, Controladores ODBC
  1. Para conectarse vía ADO se pueden usar las siguientes opciones en la cadena de conexión:
    • Provider=MSDASQL; indicar que usamos el proveedor ODBC para ADO
    • Driver={PostgreSQL ANSI}; seleccionar el controlador ODBC PostgreSQL ANSI
    • SERVER=localhost; ubicación del servidor (ip o dns)
    • DATABASE=saraza; nombre de la base de datos a usar
    • UID=sistema; usuario (dentro de la base de datos)
    • PWD=saraza; contraseña del usuario
    • CONNSETTINGS=SET Datestyle TO 'DMY'%3bSET client_ecoding TO 'LATIN1'3b; parámetros de conexión (ej: formato fecha a dia-mes-año y codificación latin1)
    • BOOLSASCHAR=0; no devolver booleanos como chars 't' o 'f'
    • TrueIsMinus1=1; booleanos verdaderos convertirlos a -1 (para compatibilidad con VB)
    • TEXTASLONGVARCHAR=1; devolver campos Text como LongVarChar?
    • SSLMODE=prefer; preferir encriptación SSL (require: falla si no hay SSL, prefer: se conecta igual aunque no haya SSL, allow: primero intenta sin SSL, luego con SSL, disable: se conecta sólo sin SSL)
    • UseDeclareFetch=0; no usar cursores (habilitar para consultas extensas asi utliza una cache en memoria y mejora la performance)
    • UpdatableCursors=0; no habilitar la emulación de cursores modificables
    • PARSE=1; analizar las consultas para determinar campos, tipos de datos, etc.
    • UseServerSidePrepare=0; no usar el protocolo extendido para preparar y analizar las consultas en el servidor (más efectivo y correcto a partir de 7.4+)
    • DisallowPremature=0; deshabilitar preparación prematura de las consultas para analizarlas (7.3 y anteriores)

Ejemplo de cadena de conexión (connection string) simple:

Provider=MSDASQL;Driver={PostgreSQL ANSI};SERVER=localhost;DATABASE=saraza;UID=sistema;PWD=saraza;

Ejemplo de cadena de conexión avanzado:

Provider=MSDASQL;Driver={PostgreSQL ANSI};
SERVER=localhost;DATABASE=saraza;UID=sistema;PWD=saraza;
CONNSETTINGS=SET Datestyle TO 'DMY'%3bSET client_ecoding TO 'LATIN1'3b;
BOOLSASCHAR=0;TrueIsMinus1=1;TEXTASLONGVARCHAR=1;
SSLMODE=prefer;
UseDeclareFetch=0;UpdatableCursors=0;
PARSE=1;UseServerSidePrepare=0;DisallowPremature=0;

Para más información ver  Sitio Oficial

¿Cómo conectarse a PostgreSQL desde Access?

Se recomienda usar ADO (ActiveX Data Objects) y el controlador oficial ODBC (ver pregunta anterior):

  • En la vista de Objetos, Tablas, Botón derecho (sobre el fondo), elegir el tipo de acción a realizar:
    • Importar: para obtener una copia de los datos de PostgreSQL y modificarlos localmente
    • Vincular: para poder obtener y actualizar los datos directamente sobre PostgreSQL
  • En tipo de Archivo, elegir la opción Base de Datos ODBC
  • Elegir PostgreSQL ... (en solapa Origen de Datos de Archivo o de equipo, dependiendo como se haya instalado el controlador ODBC, ver pregunta anterior)
  • Ingresar los datos de conexión (PostgreSQL Connection, ver pregunta anterior): base de datos (database), servidor (server), usuario (username), contraseña (password), presionar Ok
  • Buscar y marcar las tablas a Importar/Vincular (notar que figuran con el nombre de esquema antepuesto, ej. public.mi_tabla), presionar Aceptar.

¿Cómo conectarse a PostgreSQL desde Visual Basic?

Se recomienda usar ADO (ActiveX Data Objects) y el controlador oficial ODBC (ver pregunta anterior)

Ejemplo para VB 5/6:

Dim cn As Connection
Dim rs As Recordset

Set cn = CreateObject("ADODB.Connection")
cn.Open "Provider=MSDASQL;Driver={PostgreSQL ANSI};SERVER=localhost;DATABASE=saraza;UID=sistema;PWD=saraza;"

Set rs = CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM prueba", cn, adUseClient

Do Until rs.EOF
    Debug.Print rs!campo1, rs!campo2
    rs.MoveNext
Loop

¿Como conectarse a PostgreSQL desde .NET (o Mono)?

Npgsql es un .Net Data Provider (Proveedor de Datos) para PostgreSQL. Permite a aplicaciones cliente .Net (Console, WinForms?, ASP.NET, Web Services...) comunicarse con el servidor. Si tiene experiencia desarrollando aplicaciones de acceso a datos usando los proveedores Sql Server, OleDB o ODBC.NET, encontrará que Npgsql es muy similar, en muchos aspectos igual o más robusto, y soportado por una comunidad activa.

  1. Descargar Npgsql compilado para MS.Net y Mono desde  El proyecto.
  2. Instalación:
    1. Copiar la libreria Npgsql.dll en el directorio de la aplicación (o en otro directorio si ha configurado Path to Private Components)
    2. En aplicaciones ASP.NET y Web Services debe alojar Npgsql.dll y Mono.Security.dll en un subdirectorio bin de la aplicación.
    3. Alternativamente, puede poner el assembly Npgsql en la Global Assembly Cache (GAC) ejecutando: gacutil -i Npgsql.dll
  3. Uso:
    1. Agregar los espacios de nombre (namespaces) requeridos en los archivos fuente: System.Data y Npgsql
    2. Establecer una conexión usando NpgsqlConnection con la correspondiente cadena de conexión (connection string)
    3. Usar NpgsqlCommand para ejecutar consultas SQL
    4. Usar NpgsqlDataReader para obtener las filas de la consulta

Ejemplo completo para C#:

using System;
using System.Data;
using Npgsql;

public class NpgsqlPrueba
{
  public static void Main(String[] args)
  {
    // Establecer una conexión al servidor ubicado en la IP 127.0.0.1, puerto 5432
    // como usuario "juan", con contraseña "secreta", en la base de datos "datosjuan"
    NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;" + 
                                  "User Id=juan;Password=secreto;Database=datosjuan;");
    conn.Open();
   
    try {
      // Agregar una fila en una tabla
      NpgsqlCommand command1 = new NpgsqlCommand("insert into tabla1 values(1, 1)", conn);
      Int32 rowsaffected;
      rowsaffected = command1.ExecuteNonQuery();
      Console.WriteLine("Se agregaron {0} filas en tabla1", rowsaffected);

      // Obteniendo un conjunto de filas de una consulta
      NpgsqlCommand command2 = new NpgsqlCommand("select * from tabla1", conn);
      NpgsqlDataReader dr = command2.ExecuteReader();
      while(dr.Read()) {
        for (i = 0; i < dr.FieldCount; i++) {
          Console.Write("{0} \t", dr[i]);
        }
      }
      Console.WriteLine();
    } finally {
      conn.Close();
    }
  }
}

Para mayor información ver la  Documentación del Proyecto

¿Cómo conectarse a PostgreSQL desde Python?

Se recomienda usar el controlador Psycopg2 compatible con dbapi (ver  Psycopg2 para windows) En debian/ubuntu instalar:

sudo apt-get install python-psycopg2

Ejemplo para Python 2.x y psycopg2:

import psycopg2

cn = psycopg2.connect("host=localhost dbname=saraza user=mariano password=saraza")

cur = cn.cursor()  
cur.execute("SELECT campo1, campo2 FROM prueba")

for fila in cur:
    campo1, campo2 = fila # extraer los campos
    print campo1, campo2

¿Cómo conectarse a PostgreSQL desde PHP?

Se pueden utilizar dos métodos:

  • La extensión pgsql: habilitando la opción
  • El controlador para PHP Data Objects (PDO):

Para instalarlo en windows, seleccionar en el instalador (pantalla Chose Items to Install):

  • Extensión pgsql: PHP, Extensions, PostgreSQL
  • Controlador PDO: PHP, Extensions, PDO y PHP, Extensions, PDO, PostgreSQL

Para instalarlo en linux (debian) hacer:

sudo apt-get install php5-pgsql

Ejemplo para PHP 5.2 con pgsql:

<?php
// Conectarse a la base de datos prueba con usuario www y contraseña foo
$dbconn = pg_connect("host=localhost dbname=prueba user=www password=foo")
    or die('No se pudo conectar: ' . pg_last_error());

// Realizando una consulta SQL
$query = 'SELECT * FROM autores';
$result = pg_query($query) or die('Falló consulta: ' . pg_last_error());

// Imprimiendo los resultados en HTML
echo "<table>\n";
while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
    echo "\t<tr>\n";
    foreach ($line as $col_value) {
        echo "\t\t<td>$col_value</td>\n";
    }
    echo "\t</tr>\n";
}
echo "</table>\n";

// Liberar el resultset
pg_free_result($result);

// Cerrar la conexión
pg_close($dbconn);
?>

Ejemplo para PHP 5.2.x con PDO:

<?php
# me conecto a la base prueba, usuario mariano contraseña foo
# (habilitando conexiones persistentes)
$conn = new PDO('pgsql:dbname=prueba;host=localhost', 'mariano', 'foo',  
                array(PDO::ATTR_PERSISTENT => true));
# establezco el atributo para lanzar excepciones en caso de error
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

# ejecuto una consulta y retorno los datos
$res = $conn->query("SELECT * FROM autores");
# recorro los registros
foreach ($res as $reg) {
    echo $reg['nombre'],$reg['apellido'];
}

# ejecutar una consulta DML:
try {
    # comienzo la transacción
    $conn->beginTransaction(); 
    $conn->exec("INSERT INTO autores (nombre, apellido) VALUES ('Juan', 'Perez')");
    # grabo (confirmo) los cambios
    $conn->commit(); 
    return NULL;
} catch (Exception $e) {
    # excepción, vuelvo atrás y devuelvo mensaje de error
    $conn->rollback(); 
    echo "Error: ", $e->getMessage();
}
?>

En Windows puede ocurrir el siguiente error:

Unable to load dynamic library 'php_pgsql.dll' - The specified module could not be found.

Para solucionar este error de carga de la extensión pgsql se puede:

  • Agregar la ruta de los binarios de postgres al PATH del sistema, haciendo click derecho en Mi PC, seleccionar Propiedades, solapa Avanzado, botón "Variables de Entorno,sección Variables del Sistema, seleccionar Path y presionar Editar y agregar la ruta de PostgreSQL al final: C:\Archivos de programa\PostgreSQL\8.4\bin (separado por ;). Luego reiniciar
  • Ubicar la biblioteca libpq.dll y sus dependencias (comerr32.dll, gssapi32.dll, k5sprt32.dll, krb5_32.dll, libeay32.dll, libiconv2.dll, libintl3.dll, ssleay32.dll), y copiarla a la carpeta de ext de PHP (C:\Archivos de programa\php\ext) y/o agregar Loadfile "C:\Archivos de programa\php\ext\libpq.dll" a la configuración de apache (httpd.conf)

Para más información ver  Manual de PHP

¿Cómo conectarse a PostgreSQL desde JAVA (JDBC)?

Instalación:

  • Obtener la versión precompilada del driver JDBC del  descargas
  • Ajustar el CLASSPATH:
    export CLASSPATH=...:/ruta/a/postgresql.jar:.
    

Ejemplo para Java:

// importar JDBC
import java.sql.*;

public class PruebaPgJdbc {
  public static void main(String args[]) {
    try {
      // cargar y registrar el manejador para postgres
      Class.forName("org.postgresql.Driver");
      // conectarse a la base de datos (base prueba, usuario pedro, contraseña secreto, ssl habilitado):
      String url = "jdbc:postgresql://localhost/prueba";
      Properties props = new Properties();
      props.setProperty("user","pedro");
      props.setProperty("password","secreto");
      props.setProperty("ssl","true");
      Connection conn = DriverManager.getConnection(url, props);

      // enviar una consulta y obtener los resultados:
      Statement st = conn.createStatement();
      ResultSet rs = st.executeQuery("SELECT * FROM mitabla WHERE columna1 = 500");
      while (rs.next()) {
          System.out.print("Columna 1 devolvio ");
          System.out.println(rs.getString(1));
      }
      rs.close();
      st.close();

      // ejecutando actualizaciones:
      int valor = 500;
      PreparedStatement st = conn.prepareStatement("DELETE FROM mitabla WHERE columna1 = ?");
      st.setInt(1, valor);
      int rowsDeleted = st.executeUpdate();
      System.out.println(rowsDeleted + " filas eliminadas");
      st.close();
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Para más información ver  sitio oficial