Создание базы данных в PostgreSQL через JDBC при отсутствии
Быстрый ответ
В PostgreSQL для условного создания базы данных применяется блок DO:
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_database WHERE datname = 'ваша_бд') THEN
EXECUTE 'CREATE DATABASE ваша_бд';
END IF;
END $$;
Напишите вместо 'ваша_бд'
название вашей базы данных. Этот простой и изящный код создаст базу данных, только если она ещё не была создана ранее.
Условное создание баз данных
Shell и Psql
Для любителей скриптинга, комбинация psql и bash упрощает условное создание базы данных через командную строку:
psql -tc "SELECT 1 FROM pg_database WHERE datname = 'ваша_бд'" | grep -q 1 || psql -c "CREATE DATABASE ваша_бд"
Параметр -t
обеспечивает вывод без лишних строк, а -c
выполняет указанную SQL-команду. grep -q 1
проверяет результат без вывода на консоль, а конструкция ||
служит оператором логического ИЛИ, позволяя создать базу данных, если она ещё не обнаружена.
Король условных конструкций: Dblink
Пользуясь расширением dblink, можно осуществлять 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 для элегантного решения ситуации:
DO $$
BEGIN
BEGIN
EXECUTE 'CREATE DATABASE ваша_бд';
EXCEPTION WHEN duplicate_database THEN
RAISE NOTICE 'База данных уже есть. Продолжайте работу!'; -- Ситуация 'duplicate_database' не является препятствием!
END;
END $$;
Этот код перехватывает исключение duplicate_database и вместо ошибки выдаёт уведомление.
Предотвращение конфликтов при совместном доступе
Чтобы избежать условной гонки между проверкой на существование базы данных и её созданием, используйте блокировку или изоляцию транзакции на уровне сериализации.
Важно помнить, что комплексное тестирование всегда является необходимым!
Рефакторинг и оптимизация: функции для повторного использования
Создание универсальных функций
Хотите повысить эффективность работы? Оберните логику в функцию для последующего применения:
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 начнётся только при наличии свободного участка:
IF NOT EXISTS (SELECT FROM pg_database WHERE datname = 'DB3')
BEGIN
CREATE DATABASE "DB3";
END;
PostgreSQL проверит, занят ли участок:
👷♂️ Имеем недвижимость: [🏠 DB1, 🏠 DB2]
🏗️ Незанятые участки: Участок DB3 свободен
Если обнаружится свободное место, начнётся создание новой базы данных:
🚧 Возведём "DB3"... Готово!
🏘️ Новый облик усадьбы: [DB1, DB2, DB3]
Вот и появилась у нас новая блестящая база данных DB3 среди других "домов" нашей виртуальной усадьбы.