Создание базы данных в PostgreSQL через JDBC при отсутствии

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

В PostgreSQL для условного создания базы данных применяется блок DO:

SQL
Скопировать код
DO $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM pg_database WHERE datname = 'ваша_бд') THEN
        EXECUTE 'CREATE DATABASE ваша_бд';
    END IF;
END $$;

Напишите вместо 'ваша_бд' название вашей базы данных. Этот простой и изящный код создаст базу данных, только если она ещё не была создана ранее.

Кинга Идем в IT: пошаговый план для смены профессии

Условное создание баз данных

Shell и Psql

Для любителей скриптинга, комбинация psql и bash упрощает условное создание базы данных через командную строку:

Bash
Скопировать код
psql -tc "SELECT 1 FROM pg_database WHERE datname = 'ваша_бд'" | grep -q 1 || psql -c "CREATE DATABASE ваша_бд"

Параметр -t обеспечивает вывод без лишних строк, а -c выполняет указанную SQL-команду. grep -q 1 проверяет результат без вывода на консоль, а конструкция || служит оператором логического ИЛИ, позволяя создать базу данных, если она ещё не обнаружена.

Пользуясь расширением dblink, можно осуществлять SQL-операции внутри транзакций:

SQL
Скопировать код
DO $$
BEGIN
   IF NOT EXISTS (SELECT 1 FROM pg_database WHERE datname = 'ваша_бд') THEN
      PERFORM dblink_connect('dbname=postgres'); -- Устанавливаем связь...
      PERFORM dblink_exec('CREATE DATABASE ваша_бд'); -- Запускаем создание базы данных...
      PERFORM dblink_disconnect(); -- Отключаемся. Не забывайте опускать занавес за собой!
   END IF;
END $$;

При использовании убедитесь, что расширение dblink установлено в вашей системе.

Имитация функциональности "IF NOT EXISTS"

Если база данных уже существует

Если предполагается, что база данных уже может быть создана, используйте PL/pgSQL для элегантного решения ситуации:

SQL
Скопировать код
DO $$
BEGIN
    BEGIN
        EXECUTE 'CREATE DATABASE ваша_бд';
    EXCEPTION WHEN duplicate_database THEN
        RAISE NOTICE 'База данных уже есть. Продолжайте работу!'; -- Ситуация 'duplicate_database' не является препятствием!
    END;
END $$;

Этот код перехватывает исключение duplicate_database и вместо ошибки выдаёт уведомление.

Предотвращение конфликтов при совместном доступе

Чтобы избежать условной гонки между проверкой на существование базы данных и её созданием, используйте блокировку или изоляцию транзакции на уровне сериализации.

Важно помнить, что комплексное тестирование всегда является необходимым!

Рефакторинг и оптимизация: функции для повторного использования

Создание универсальных функций

Хотите повысить эффективность работы? Оберните логику в функцию для последующего применения:

SQL
Скопировать код
CREATE OR REPLACE FUNCTION create_database_if_not_exists(dbname TEXT) RETURNS void AS $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM pg_database WHERE datname = dbname) THEN
        EXECUTE format('CREATE DATABASE %I', dbname);
    END IF;
END
$$ LANGUAGE plpgsql;

Теперь вы можете создать базу данных, вызвав create_database_if_not_exists('ваша_бд'). Берегите модульность вашего кода.

JDBC и автоматизация процессов

Автоматизируйте процессы на стороне приложения при помощи JDBC, строя логику операций так же, как в привычных SQL-диалектах.

Визуализация

Вообразите систему PostgreSQL в виде усадьбы с несколькими участками (базами данных):

🏘️ Усадьба: [DB1, DB2, DB3?]

Строительство базы данных DB3 начнётся только при наличии свободного участка:

SQL
Скопировать код
IF NOT EXISTS (SELECT FROM pg_database WHERE datname = 'DB3')
BEGIN
    CREATE DATABASE "DB3";
END;

PostgreSQL проверит, занят ли участок:

👷‍♂️ Имеем недвижимость: [🏠 DB1, 🏠 DB2]
🏗️ Незанятые участки: Участок DB3 свободен

Если обнаружится свободное место, начнётся создание новой базы данных:

🚧 Возведём "DB3"... Готово!
🏘️ Новый облик усадьбы: [DB1, DB2, DB3]

Вот и появилась у нас новая блестящая база данных DB3 среди других "домов" нашей виртуальной усадьбы.

Полезные материалы

  1. PostgreSQL: Документация: 16: CREATE DATABASE
  2. "Минуточку внимания..."
  3. Удобные команды – Вики PostgreSQL
  4. PG Casts
  5. GitHub – dbt-labs/dbt-utils: Утилиты для проектов DBT
  6. SQL Info: Альтернативы IF NOT EXISTS в PostgreSQL