IBM Cloud Docs
Conexión de una aplicación externa al despliegue de PostgreSQL

Conexión de una aplicación externa al despliegue de PostgreSQL

Las aplicaciones y los controladores utilizan series de conexión para establecer una conexión a IBM Cloud® Databases for PostgreSQL. El servicio proporciona series de conexión específicamente para controladores y aplicaciones. Las cadenas de conexión se muestran en el panel Endpoints de la vista general de la implantación y también se pueden recuperar desde el complemento CLI de Cloud Databases y la API de Cloud Databases.

Las cadenas de conexión pueden ser utilizadas por cualquiera de las credenciales que crees en tu despliegue. Aunque puede utilizar el usuario administrador para todas las conexiones y aplicaciones, quizás sea mejor crear usuarios específicamente para conectarse a las aplicaciones. Para obtener más información, consulte Obtención de cadenas de conexión.

Conexión al despliegue de PostgreSQL con un controlador de lenguaje

Toda la información que necesita un controlador para realizar una conexión con el despliegue se encuentra en la sección "postgres" de las series de conexión. La tabla contiene un desglose para referencia.

información de conexión postgres/URI
Nombre de campo Índice Descripción
Type Tipo de conexión - para PostgreSQL, es "URI".
Scheme Esquema para un URI - para PostgreSQL, es "postgresql".
Path Vía de acceso para un URI: para PostgreSQL, es el nombre de la base de datos. El valor predeterminado es ibmclouddb.
Authentication Username El nombre de usuario que utiliza para conectarse.
Authentication Password Una contraseña para el usuario; puede mostrarse como $PASSWORD
Authentication Method Cómo se realiza la autenticación; la autenticación "directa" la maneja el controlador.
Hosts 0... Un nombre de host y un puerto al que conectar.
Composed 0... Un URI que combina esquema, autenticación, host y ruta.
Certificate Name El nombre asignado para el certificado propietario del servicio para el despliegue de la base de datos.
Certificate Base64 Una versión codificada en base64 del certificado.
  • 0... indica que puede haber una o varias de estas entradas en una matriz.

Muchos controladores de PostgreSQL pueden realizar una conexión con el despliegue si se les proporciona la serie de conexión con formato URI en el campo "Compuesto" de la información de conexión. Por ejemplo:

postgres://ibm_cloud_30399dec_4835_4967_a23d_30587a08d9a8:$PASSWORD@981ac415-5a35-4ac7-b6bb-fb609326dc42.8f7bfd8f3faa4218aec56e069eb46187.databases.appdomain.cloud:32704/ibmclouddb?sslmode=verify-full

El ejemplo siguiente utiliza la información de la serie de conexión y el controlador Java jdbc para conectarse a la base de datos.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.logging.*;

public class PGConnect {

    private final static Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

    private Connection connect() {

        final String url = "jdbc:postgresql://host:port/ibmclouddb";

        Properties props = new Properties();
        props.setProperty("user","admin");
        props.setProperty("password","mypassword123");
        props.setProperty("ssl","true");
        props.setProperty("sslmode","verify-full");
        props.setProperty("sslrootcert", "/path/to/cert");

        Connection conn = null;
        while (conn == null) {
            try {
                conn = DriverManager.getConnection(url, props);
                System.out.println("Connected to PG");
            } catch (SQLException e) {
                System.out.printf("%s\n", e);
                LOGGER.info("Not connected, retying ...");
            }
        }

        return conn;

    }

    public static void main(String[] args) {

        PGConnect icd = new PGConnect();

        try {
            Connection connection = icd.connect();
            Statement stmt = connection.createStatement();

            ResultSet rs = stmt.executeQuery("SELECT * from pg_database");
            while (rs.next()) {
                System.out.println("DB Name: " + rs.getString(1));
            }

        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }   
    }
}

El ejemplo siguiente utiliza la información de la serie de conexión y el controlador Python Psycopg2 para conectarse a la base de datos. Esto es solo un ejemplo de conexión simple, sin el manejo de errores o la lógica de reintento y puede que no sea adecuado para el entorno de producción.

import psycopg2

try:
    conn = psycopg2.connect(
      host="hostname.databases.appdomain.cloud",
      port= 31525,
      user="username",
      password="password",
      sslmode="verify-full",
      sslrootcert="/path/to/cert/ca-certificate.crt",
      database="ibmclouddb")
except:
    print("Unable to connect to database")

cur = conn.cursor()
cur.execute("SELECT datname FROM pg_database")
rows = cur.fetchall()

print("List of databases:")
for row in rows:
    print("  ",row[0])

El ejemplo siguiente utiliza la información de la serie de conexión y el controlador de nodo node-postgres para conectarse a la base de datos.

const pg = require("pg");
const fs = require("fs");

let connectionString = "postgres://<username>:<password>@<host>:<port>/<database>";
let caCert = fs.readFileSync('/path/to/cert');

// set up a client with your PostgreSQL connection string and TLS options
let client = new pg.Client({
    connectionString: connectionString,
    ssl: {
    ca: caCert,
    rejectUnauthorized: true
    }
});


client.connect(function(err) {
    if (err) {
        console.log(err);
        process.exit(1);
    } else {
        // query for the names of the databases
        client.query(
            "SELECT datname FROM pg_database;",
            function(err, result) {
                if (err) {
                    console.log(err);
                }
                // return the names of the databases
                console.log(result.rows);
                client.end();
            }
        );
    }
});

Para utilizar node-postgres driver, elimine el parámetro sslmode de la serie de conexión del despliegue. Si no es así, este parámetro altera temporalmente los parámetros ssl: {...}, lo que impide que el certificado de CA se cargue correctamente.

Soporte de TLS para controladores y certificados propietarios de servicios

Todas las conexiones a Databases for PostgreSQL tienen habilitado TLS 1.2, por lo que el controlador que se utiliza para conectar tiene que admitir el cifrado. Su implantación también incluye un certificado propietario del servicio para que el controlador pueda verificar el servidor en el momento de la conexión.

Para obtener más información, consulte Cloud Databases FAQ de certificados.

Utilización del certificado propietario del servicio

  1. Copie la información del certificado del panel Puntos finales o del campo Base64 de la información de conexión.
  2. Si es necesario, decodifique la serie Base64 en texto.
  3. Guarde el certificado en un archivo. (Puede utilizar el nombre que se proporciona o un nombre de archivo de su elección).
  4. Proporcione al controlador o al cliente la vía de acceso al certificado.

El panel CLI Endpoints
' La pestaña CLI plug-in information

Compatibilidad del complemento CLI con el certificado propietario del servicio

Puede mostrar el certificado descodificado para su implantación con el complemento CLI con el comando ibmcloud cdb deployment-cacert "example-deployment". Decodifica la serie base64 a texto. Copie y guarde la salida del mandato en un archivo y proporcione la vía de acceso del archivo al controlador.

Otros controladores

PostgreSQL tiene una amplia gama de controladores de idioma. En la tabla se incluyen algunos de los más comunes.

controladores postgresql
Idioma Controlador Ejemplos
PHP pgsql Enlace
Ruby ruby-pg Enlace
Ruby on Rails Rails Enlace
C# ODBC Enlace
Go pq Enlace
Node node-postgres Enlace