পোস্টগ্রি সমর্থন করে না IF NOT EXISTS
জন্য CREATE DATABASE
বিবৃতি। এটি কেবল সমর্থিত CREATE SCHEMA
। তদুপরি CREATE DATABASE
লেনদেনে জারী করা যায় না তাই এটি DO
ব্যতিক্রম ধরা ব্যতীত হতে পারে না ।
যখন CREATE SCHEMA IF NOT EXISTS
জারি করা হয় এবং স্কিমা ইতিমধ্যে উপস্থিত থাকে তখন নকল বস্তুর তথ্যের সাথে বিজ্ঞপ্তিটি (ত্রুটি নয়) উত্থাপিত হয়।
এই সমস্যাগুলি সমাধান করার জন্য আপনাকে dblink
এক্সটেনশন ব্যবহার করতে হবে যা ডেটাবেস সার্ভারের সাথে একটি নতুন সংযোগ খোলে এবং লেনদেন না করেই কোয়েরি চালায়। আপনি খালি স্ট্রিং সরবরাহের সাথে সংযোগের প্যারামিটারগুলি পুনরায় ব্যবহার করতে পারেন।
নীচে এমন PL/pgSQL
কোড রয়েছে যা সম্পূর্ণরূপে CREATE DATABASE IF NOT EXISTS
একই আচরণের সাথে অনুকরণ করে CREATE SCHEMA IF NOT EXISTS
। এটি CREATE DATABASE
মাধ্যমে কল করে dblink
, ধরুন duplicate_database
ব্যতিক্রম (যা জারি করা হয় যখন ডাটাবেস ইতিমধ্যে উপস্থিত থাকে) এবং প্রচারের সাথে নোটিশে রূপান্তর করে errcode
। স্ট্রিং মেসেজটি , skipping
একইভাবে সংযুক্ত হয়েছে যেভাবে এটি হয় CREATE SCHEMA IF NOT EXISTS
।
CREATE EXTENSION IF NOT EXISTS dblink;
DO $$
BEGIN
PERFORM dblink_exec('', 'CREATE DATABASE testdb');
EXCEPTION WHEN duplicate_database THEN RAISE NOTICE '%, skipping', SQLERRM USING ERRCODE = SQLSTATE;
END
$$;
এই সমাধানটি অন্য জবাবগুলির মতো কোনও বর্ণের শর্ত ছাড়াই, যেখানে ডাটাবেসটি উপস্থিত রয়েছে এবং তার নিজস্ব তৈরি কিনা তা যাচাই করার মধ্যে বহিরাগত প্রক্রিয়া (বা একই স্ক্রিপ্টের অন্য উদাহরণ) দ্বারা তৈরি করা যেতে পারে।
তদ্ব্যতীত যখন CREATE DATABASE
ডাটাবেসের চেয়ে অন্য ত্রুটিটি ব্যর্থ হয় তবে এই ত্রুটিটি ত্রুটি হিসাবে প্রচারিত হয় এবং নীরবে বাদ দেওয়া হয় না। শুধুমাত্র duplicate_database
ত্রুটির জন্য ধরা আছে । সুতরাং এটি সত্যিই IF NOT EXISTS
উচিত হিসাবে আচরণ করে ।
আপনি এই কোডটিকে নিজের ফাংশনে রাখতে পারেন, এটিকে সরাসরি বা লেনদেন থেকে কল করতে পারেন। কেবল রোলব্যাক (পুনরুদ্ধার করা ডাটাবেস) কাজ করবে না।
আউটপুট পরীক্ষা করা (ডিও এর মাধ্যমে দু'বার বলা হয় এবং তারপরে সরাসরি):
$ sudo -u postgres psql
psql (9.6.12)
Type "help" for help.
postgres=# \set ON_ERROR_STOP on
postgres=# \set VERBOSITY verbose
postgres=#
postgres=# CREATE EXTENSION IF NOT EXISTS dblink;
CREATE EXTENSION
postgres=# DO $$
postgres$# BEGIN
postgres$# PERFORM dblink_exec('', 'CREATE DATABASE testdb');
postgres$# EXCEPTION WHEN duplicate_database THEN RAISE NOTICE '%, skipping', SQLERRM USING ERRCODE = SQLSTATE;
postgres$# END
postgres$# $$;
DO
postgres=#
postgres=# CREATE EXTENSION IF NOT EXISTS dblink;
NOTICE: 42710: extension "dblink" already exists, skipping
LOCATION: CreateExtension, extension.c:1539
CREATE EXTENSION
postgres=# DO $$
postgres$# BEGIN
postgres$# PERFORM dblink_exec('', 'CREATE DATABASE testdb');
postgres$# EXCEPTION WHEN duplicate_database THEN RAISE NOTICE '%, skipping', SQLERRM USING ERRCODE = SQLSTATE;
postgres$# END
postgres$# $$;
NOTICE: 42P04: database "testdb" already exists, skipping
LOCATION: exec_stmt_raise, pl_exec.c:3165
DO
postgres=#
postgres=# CREATE DATABASE testdb;
ERROR: 42P04: database "testdb" already exists
LOCATION: createdb, dbcommands.c:467
dblink_connect
।