স্পষ্টত কার্সারগুলি খুব কমই plpgsql এ প্রয়োজন। একটি লুপের সহজ এবং দ্রুত অন্তর্নিহিত কার্সার ব্যবহার করুন FOR
:
দ্রষ্টব্য: যেহেতু টেবিলের নামগুলি প্রতিটি ডাটাবেস অনুসারে অনন্য নয়, আপনার নিশ্চিত হওয়ার জন্য আপনার সারণি-যোগ্যতার তালিকা থাকতে হবে। এছাড়াও, আমি ফাংশনটি ডিফল্ট স্কিমা 'সর্বজনীন' এর মধ্যে সীমাবদ্ধ করি। আপনার প্রয়োজন অনুযায়ী মানিয়ে কিন্তু সিস্টেম স্কিমের অগ্রাহ্য নিশ্চিত করা pg_*
এবং information_schema
।
হতে খুব সতর্কতা অবলম্বন এই ফাংশন সঙ্গে। তারা আপনার ডেটাবেসকে অবিচ্ছিন্ন করে। আমি একটি শিশু সুরক্ষা ডিভাইস যুক্ত করেছি। বোমাটি প্রাইম করার জন্য RAISE NOTICE
লাইনটি এবং অসুবিধার EXECUTE
বিষয়ে মন্তব্য করুন ...
CREATE OR REPLACE FUNCTION f_truncate_tables(_username text)
RETURNS void AS
$func$
DECLARE
_tbl text;
_sch text;
BEGIN
FOR _sch, _tbl IN
SELECT schemaname, tablename
FROM pg_tables
WHERE tableowner = _username
AND schemaname = 'public'
LOOP
RAISE NOTICE '%',
-- EXECUTE -- dangerous, test before you execute!
format('TRUNCATE TABLE %I.%I CASCADE', _sch, _tbl);
END LOOP;
END
$func$ LANGUAGE plpgsql;
format()
Postgres 9.1 বা তার পরে প্রয়োজন। পুরানো সংস্করণগুলিতে কোয়েরি স্ট্রিংটিকে এভাবে যুক্ত করে:
'TRUNCATE TABLE ' || quote_ident(_sch) || '.' || quote_ident(_tbl) || ' CASCADE';
একক কমান্ড, কোনও লুপ নেই
যেহেতু আমরা TRUNCATE
একসাথে একাধিক টেবিল করতে পারি আমাদের কোনও কার্সার বা লুপের প্রয়োজন নেই:
সমস্ত সারণির নাম একত্রিত করুন এবং একটি বিবৃতি কার্যকর করুন ute সহজ, দ্রুত:
CREATE OR REPLACE FUNCTION f_truncate_tables(_username text)
RETURNS void AS
$func$
BEGIN
RAISE NOTICE '%',
-- EXECUTE -- dangerous, test before you execute!
(SELECT 'TRUNCATE TABLE '
|| string_agg(format('%I.%I', schemaname, tablename), ', ')
|| ' CASCADE'
FROM pg_tables
WHERE tableowner = _username
AND schemaname = 'public'
);
END
$func$ LANGUAGE plpgsql;
কল করুন:
SELECT truncate_tables('postgres');
পরিশোধিত ক্যোয়ারী
এমনকি আপনার কোনও ফাংশনের দরকার নেই। পোস্টগ্রিস 9.0+ এ আপনি একটি DO
বিবৃতিতে গতিশীল কমান্ডগুলি কার্যকর করতে পারেন । এবং পোস্টগ্রিস 9.5+ এ বাক্য গঠন আরও সহজ হতে পারে:
DO
$func$
BEGIN
RAISE NOTICE '%',
-- EXECUTE
(SELECT 'TRUNCATE TABLE ' || string_agg(oid::regclass::text, ', ') || ' CASCADE'
FROM pg_class
WHERE relkind = 'r' -- only tables
AND relnamespace = 'public'::regnamespace
);
END
$func$;
আমাদের সম্পর্কে মধ্যে পার্থক্য pg_class
, pg_tables
এবং information_schema.tables
:
regclass
সারণীর নামগুলি সম্পর্কে এবং উদ্ধৃত:
বারবার ব্যবহারের জন্য
আপনার ভ্যানিলা কাঠামো এবং সমস্ত খালি টেবিল দিয়ে একটি "টেম্পলেট" ডাটাবেস তৈরি করুন (আসুন এটির নাম দিন my_template
)। তারপরে একটি DROP
/CREATE DATABASE
চক্রের মধ্য দিয়ে যান :
DROP DATABASE mydb;
CREATE DATABASE mydb TEMPLATE my_template;
এটি অত্যন্ত দ্রুত , কারণ পোস্টগ্রিস ফাইলের স্তরে পুরো কাঠামোটি অনুলিপি করে। কোনও সম্মতিযুক্ত সমস্যা বা অন্যান্য ওভারহেড আপনাকে ধীর করে দিচ্ছে না।
যদি সমবর্তী সংযোগগুলি আপনাকে ডিবি বাদ দিতে দেয় তবে বিবেচনা করুন: