¿Simular CREAR BASE DE DATOS SI NO EXISTE para PostgreSQL?

Quiero crear una base de datos que no existe a través de JDBC. A diferencia de MySQL, PostgreSQL no admite la sintaxis de creación si no existe. Cuál es la mejor manera de lograr esto?

La aplicación no sabe si la base de datos existe o no. Se debe verificar y si existe la base de datos se debe utilizar. Por lo tanto, tiene sentido conectarse a la base de datos deseada y si la conexión falla debido a la inexistencia de la base de datos, debe crear una nueva base de datos (al conectarse a la base de datos predeterminada de Postgres). Verifiqué el código de error devuelto por Postgres pero no pude encontrar ningún código relevante que especifique lo mismo.

Otro método para lograr esto sería conectarse a la base de datos de Postgres y verificar si existe la base de datos deseada y tomar las medidas correspondientes. El segundo es un poco tedioso para hacer ejercicio.

¿Hay alguna manera de lograr esta funcionalidad en Postgres?

Puedes consultar el catálogo del sistema. La parte difícil es (como se ha comentado) que CREATE DATABASE solo puede ejecutarse como una sola instrucción. Per documentation:

CREATE DATABASE cannot be executed inside a transaction block.

Por lo tanto, no se puede ejecutar dentro de una función o declaración DO, donde estaría dentro de un bloque de transacción implícitamente. Sin embargo, esto puede ser evitado usando una conexión dblink con la base de datos actual, que se ejecuta fuera del bloque de transacción. Por lo tanto, los efectos no pueden ser revertidos.

Debe instalar el módulo adicional dblink (una vez por db):

> How to use (install) dblink in PostgreSQL?

Entonces:

DO
$do$
BEGIN
   IF EXISTS (SELECT 1 FROM pg_database WHERE datname = 'mydb') THEN
      RAISE NOTICE 'Database already exists'; 
   ELSE
      PERFORM dblink_exec('dbname=' || current_database()  -- current db
                        , 'CREATE DATABASE mydb');
   END IF;
END
$do$;

Una explicación detallada de cómo funciona:

> How do I do large non-blocking updates in PostgreSQL?

Probado con Postgres 9.3. Podrías hacer de esto una función para uso repetido.

Por favor indique la dirección original:¿Simular CREAR BASE DE DATOS SI NO EXISTE para PostgreSQL? - Código de registro