SQLite-তে PRAGMA একটি বিশেষ ধরনের SQL কমান্ড, যা সাধারণ ডেটা ম্যানিপুলেশন নয়, বরং ডাটাবেস ইঞ্জিনের অভ্যন্তরীণ পরিবেশগত চলক (environmental variables) ও স্টেট ফ্ল্যাগ নিয়ন্ত্রণ করে। PRAGMA ব্যবহার করে আমরা ডাটাবেসের কনফিগারেশন দেখতে ও পরিবর্তন করতে পারি, পারফরম্যান্স টিউন করতে পারি, ডিবাগিং তথ্য পেতে পারি, এবং টেবিল ও ইনডেক্স সংক্রান্ত মেটাডেটা বের করতে পারি। অনেক PRAGMA শুধুমাত্র বর্তমান ডাটাবেস সংযোগের জন্য কাজ করে, আবার কিছু পুরো ডাটাবেস ফাইলের উপর প্রভাব ফেলে। আজকের পর্বে আমরা প্রায় সবগুলো গুরুত্বপূর্ণ PRAGMA-এর সিনট্যাক্স, ব্যবহার এবং বাস্তব উদাহরণ বিস্তারিতভাবে আলোচনা করব।
পূর্বপ্রস্তুতি:
- SQLite ইন্সটল থাকতে হবে (তৃতীয় পর্ব দেখুন)।
- আমরা
company.dbডাটাবেস ও তারCOMPANYটেবিল ব্যবহার করব। যদি না থাকে, আগের পর্বের ডেটা তৈরি করে নিন। - কোনো অতিরিক্ত প্যাকেজের প্রয়োজন নেই – PRAGMA SQLite-তে বিল্ট-ইন।
১. PRAGMA-এর সাধারণ সিনট্যাক্স
PRAGMA দিয়ে কোনো মান পড়তে বা সেট করতে পারেন।
মান পড়া (Query):
sql
PRAGMA pragma_name;
নতুন মান সেট করা (Set):
sql
PRAGMA pragma_name = value;
অথবা কিছু PRAGMA-তে value নামেও সেট করা যায়, যেমন PRAGMA cache_size = 4000;।
অনেক PRAGMA একটি ডাটাবেসের নাম (অ্যালিয়াস) সহ ব্যবহার করা যায়:
sql
PRAGMA database_name.pragma_name; PRAGMA database_name.pragma_name = value;
গুরুত্বপূর্ণ: PRAGMA-এর মান রিটার্ন ভ্যারি করে – কিছু টেবিল আকারে, কিছু একক মান, কিছু সেটিং-এর উপর নির্ভর করে।
২. গুরুত্বপূর্ণ PRAGMA সমূহের তালিকা ও উদাহরণ
নিচে প্রয়োজনীয় PRAGMA-গুলোকে ভাগ করে ব্যাখ্যা করা হলো। (সব উদাহরণ SQLite প্রম্পটে চালানো যাবে।)
২.১ ডাটাবেস ফাইল সংক্রান্ত
auto_vacuum – অটো-ভ্যাকুয়াম মোড দেখা/সেট করা (ডিফল্ট: NONE/0)।
sql
PRAGMA auto_vacuum; -- বর্তমান মোড দেখুন (0/1/2) PRAGMA auto_vacuum = FULL; -- পুরোপুরি অটো-ভ্যাকুয়াম চালু (1 বা FULL) PRAGMA auto_vacuum = INCREMENTAL; -- ইনক্রিমেন্টাল মোড (2)
মোড: 0 = NONE (ডিফল্ট, ফাইল কখনো ছোট হয় না, ভ্যাকুয়াম দিতে হয়), 1 = FULL (স্বয়ংক্রিয়), 2 = INCREMENTAL (ম্যানুয়ালি incremental_vacuum দিয়ে ফাঁকা জায়গা রিক্লেইম)।
page_size – ডাটাবেস পেজের আকার (ডিফল্ট 4096 বাইট)।
sql
PRAGMA page_size; PRAGMA page_size = 8192; -- পরিবর্তন করতে চাইলে পরে VACUUM করতে হবে
সতর্কতা: পেজ সাইজ পরিবর্তনের পরপরই VACUUM না চালালে ডাটাবেস দুর্নীতিগ্রস্ত হতে পারে।
page_count – বর্তমান পেজের সংখ্যা (শুধু পঠনযোগ্য)।
sql
PRAGMA page_count; -- মোট পেজ
ডাটাবেস ফাইলের আকার ≈ page_size * page_count।
max_page_count – সর্বোচ্চ পেজ সীমা। ডিফল্ট 1073741823 (১ গিগা-পেজ)।
sql
PRAGMA max_page_count = 100000; -- সীমা বেঁধে দেওয়া
freelist_count – কতটি পেজ খালি অবস্থায় আছে (শুধু পড়া)।
sql
PRAGMA freelist_count;
encoding – ডাটাবেসের টেক্সট এনকোডিং (UTF-8, UTF-16le, UTF-16be)।
sql
PRAGMA encoding; -- বর্তমান এনকোডিং দেখুন PRAGMA encoding = 'UTF-8'; -- নতুন ডাটাবেস তৈরি হলে এই এনকোডিং প্রযোজ্য হবে (পরিবর্তন করতে হলে নতুন ডাটাবেস)
২.২ পারফরম্যান্স ও ক্যাশ সংক্রান্ত
cache_size – ইন-মেমরি পেজ ক্যাশের সর্বোচ্চ সাইজ (পেজ সংখ্যায়)। ডিফল্ট 2000।
sql
PRAGMA cache_size; -- বর্তমান দেখুন (ডিফল্ট 2000) PRAGMA cache_size = 4000; -- 4000 পেজের ক্যাশ (প্রায় 16 MB যদি page_size 4096 হয়)
synchronous – ডিস্ক সিঙ্ক্রোনাইজেশন মোড। মোড: OFF(0), NORMAL(1), FULL(2)।
sql
PRAGMA synchronous; PRAGMA synchronous = NORMAL; -- ডিফল্ট FULL থেকে কমিয়ে NORMAL করলে লেখার গতি বাড়ে, কিন্তু দুর্ঘটনায় ডাটা নষ্টের সামান্য ঝুঁকি থাকে।
journal_mode – জার্নাল ফাইল ব্যবস্থাপনা। ডিফল্ট DELETE।
sql
PRAGMA journal_mode; -- দেখুন PRAGMA journal_mode = WAL; -- Write-Ahead Logging (অনেক দ্রুত) PRAGMA journal_mode = MEMORY; -- জার্নাল মেমরিতে (পারফরম্যান্স বাড়ে, কিন্তু ক্র্যাশে রোলব্যাক সম্ভব নয়)
সম্ভাব্য মান: DELETE (ডিফল্ট), TRUNCATE, PERSIST, MEMORY, WAL, OFF।
temp_store – অস্থায়ী টেবিল ও ফাইলের সংরক্ষণ মোড।
sql
PRAGMA temp_store; PRAGMA temp_store = MEMORY; -- টেম্প ডেটা মেমরিতে (FILE বা DEFAULT)
temp_store_directory – টেম্প ফাইল কোথায় রাখবে। (শুধু পঠন/লিখন)
sql
PRAGMA temp_store_directory = '/tmp/sqlite';
২.৩ মেটাডেটা ও ইন্ট্রোস্পেকশন
database_list – সংযুক্ত সব ডাটাবেসের তালিকা।
sql
PRAGMA database_list;
ফলাফল: seq, name, file – আমরা আগে .databases ডট কমান্ডে যা দেখেছি।
table_info – টেবিলের কলাম তথ্য। (এটি SQLite-র খুবই জনপ্রিয় PRAGMA)
sql
PRAGMA table_info('COMPANY');
ফলাফল: cid, name, type, notnull, dflt_value, pk। প্রতিটি কলামের বিস্তারিত। এটি প্রোগ্রামিংয়ে টেবিলের গঠন বুঝতে দারুণ কাজে লাগে।
index_list – কোনো টেবিলের ইনডেক্সের তালিকা।
sql
PRAGMA index_list('COMPANY');
ফলাফল: seq, name, unique। আমরা COMPANY টেবিলে প্রাইমারি কি-র জন্য একটি ইনডেক্স (sqlite_autoindex_COMPANY_1) দেখতে পাব।
index_info – নির্দিষ্ট ইনডেক্সের বিস্তারিত।
sql
PRAGMA index_info('sqlite_autoindex_COMPANY_1');
ফলাফল: seqno, cid, name – ইনডেক্সে ব্যবহৃত কলামের তালিকা।
foreign_key_list – ফরেন কি-এর তালিকা (পরে ব্যবহার করব)।
sql
PRAGMA foreign_key_list('table_name');
schema_version – স্কিমা ভার্সন (৩২-বিট সই করা পূর্ণসংখ্যা)। স্কিমা পরিবর্তন (CREATE/ALTER/DROP) হলে বাড়ে।
sql
PRAGMA schema_version; -- বর্তমান ভার্সন দেখুন PRAGMA schema_version = 5; -- ম্যানুয়ালি সেট (সাবধান!)
user_version – ব্যবহারকারী নিজের প্রয়োজনে যে কোনো ৩২-বিট পূর্ণসংখ্যা সংরক্ষণ করতে পারেন। অ্যাপ্লিকেশন ভার্সনিং-এ কাজে আসে।
sql
PRAGMA user_version; PRAGMA user_version = 100;
২.৪ ডিবাগিং ও ট্রেস
parser_trace – SQL পার্সারের ডিবাগ প্রিন্ট চালু/বন্ধ (ডিফল্ট false)।
sql
PRAGMA parser_trace = ON; -- এরপর কোনো SQL কমান্ড দিলে পার্সিং স্টেট স্ক্রিনে প্রিন্ট হবে PRAGMA parser_trace = OFF;
sql_trace – SQL ট্রেসিং (ডিবাগ বিল্ড প্রয়োজন; সাধারণত কাজ করে না)।
sql
PRAGMA sql_trace = ON;
২.৫ আচরণ ও নিরাপত্তা
case_sensitive_like – LIKE-এর কেস সেনসিটিভিটি (ডিফল্ট false, কেস-ইনসেনসিটিভ)।
sql
PRAGMA case_sensitive_like = TRUE; -- এখন LIKE কেস-সেনসিটিভ আচরণ করবে
এই PRAGMA-র মান আবার পড়া যায় না।
count_changes – INSERT/UPDATE/DELETE-এর পর প্রভাবিত সারির সংখ্যা রিটার্ন করা (ডিফল্ট false)।
sql
PRAGMA count_changes = ON; UPDATE COMPANY SET SALARY = 30000 WHERE NAME = 'Paul'; -- আউটপুট আসবে: 2 (Paul-এর দুটি সারি আপডেট হয়েছে) PRAGMA count_changes = OFF;
recursive_triggers – ট্রিগারের ভেতর থেকে আরেকটি ট্রিগার ফায়ার করা যাবে কিনা (ডিফল্ট false)।
sql
PRAGMA recursive_triggers = TRUE;
secure_delete – ডিলিট করা ডেটা ডিস্ক থেকে পুরোপুরি মুছে ফেলা (ডিফল্ট false)। সত্য করলে ডেটা শূন্য দিয়ে ওভাররাইট হয়, নিরাপত্তা বাড়ে কিন্তু ধীর।
sql
PRAGMA secure_delete = ON;
writable_schema – sqlite_ দিয়ে শুরু হওয়া সিস্টেম টেবিল (sqlite_master) সরাসরি মডিফাই করার অনুমতি। চরম সতর্কতা! ভুল করলে সম্পূর্ণ ডাটাবেস নষ্ট হয়ে যেতে পারে।
sql
PRAGMA writable_schema = ON; -- ডেভেলপমেন্ট/ডিবাগের বাইরে কখনোই চালু করবেন না PRAGMA writable_schema = OFF;
৩. ব্যবহারিক সেশন: PRAGMA দিয়ে ডাটাবেস টিউন
company.db খুলে নিচের ধাপগুলো অনুসরণ করুন (নতুন টার্মিনালে):
bash
sqlite3 company.db
sql
.headers on
.mode column
-- বর্তমান জার্নাল মোড ওয়াল (WAL) এ সেট করি (পারফরম্যান্স)
PRAGMA journal_mode = WAL;
-- ক্যাশ সাইজ বাড়াই (4000 পেজ)
PRAGMA cache_size = 4000;
-- টেবিলের তথ্য দেখি
PRAGMA table_info('COMPANY');
-- সব ইনডেক্সের তালিকা
PRAGMA index_list('COMPANY');
-- ডাটাবেসের এনকোডিং ও পেজ সাইজ দেখি
PRAGMA encoding;
PRAGMA page_size;
-- ইউজার ভার্সন সেট করি (অ্যাপ্লিকেশনের জন্য)
PRAGMA user_version = 1;
-- auto_vacuum চেক করি
PRAGMA auto_vacuum;
ফলাফল: আপনি প্রতিটি PRAGMA-র আউটপুট টেবুলার বা স্কেলার আকারে দেখতে পাবেন।
৪. ডিরেক্টরি স্ট্রাকচার
PRAGMA কোনো ফাইল তৈরি করে না; এটি ডাটাবেস সংযোগের সেটিংস বা ফাইলের হেডার পরিবর্তন করে। আমাদের পরীক্ষার পরও ফোল্ডারে শুধু company.db থাকবে। তবে WAL জার্নাল মোড চালু করলে company.db-wal এবং company.db-shm ফাইল দেখা যেতে পারে (এগুলো জার্নালের অংশ)।
text
project-folder/ ├── company.db ├── company.db-wal (WAL মোডে স্বয়ংক্রিয়ভাবে তৈরি) └── company.db-shm
প্যাকেজ: কোনো বাড়তি প্যাকেজ প্রয়োজন নেই।
৫. গুরুত্বপূর্ণ টিপস ও সতর্কতা
- স্থায়ী পরিবর্তন: কিছু PRAGMA (যেমন auto_vacuum, encoding) শুধুমাত্র ডাটাবেস তৈরির সময় বা VACUUM-এর পরে সম্পূর্ণ কার্যকর হয়। এগুলো পরিবর্তন করে সাথে সাথে VACUUM করুন।
- writable_schema থেকে দূরে থাকুন: এটি চালু করলে ভুলক্রমে sqlite_master নষ্ট করলে ডাটাবেস আনরিডেবল হয়ে যেতে পারে। শুধু এক্সপেরিমেন্টাল ডাটাবেসে ব্যবহার করুন।
- পারফরম্যান্স বুস্ট:
journal_mode = WALএবংsynchronous = NORMALঅধিকাংশ অ্যাপ্লিকেশনে ভালো পারফরম্যান্স দেয়। তবে ব্যাটারি চালিত ডিভাইস বা সংবেদনশীল ডেটার জন্য FULL নিরাপদ। - ক্যাশ টিউনিং: বড় cache_size মেমরি খরচ বাড়ায়, কিন্তু ডিস্ক I/O কমায়। মেমরি সীমাবদ্ধ পরিবেশে মানানসই মান নির্বাচন করুন।
- PRAGMA-র রিটার্ন: প্রোগ্রামিং করার সময়
PRAGMA table_info-র রেজাল্ট সেট সাধারণ SELECT-এর মতোই পাওয়া যায়, যা ডায়নামিক স্কিমা ডিটেকশনে সহায়তা করে।
৬. কমপ্লিট প্র্যাকটিস কমান্ড
নিচের কমান্ডগুলো নিরাপদভাবে চালিয়ে PRAGMA-র সাথে পরিচিত হোন:
sql
-- সমস্ত PRAGMA-র তালিকা (সব PRAGMA দেখাবে যেগুলোর নাম জানেন)
-- কোনো সরাসরি কমান্ড নেই, তবে আপনি .help দিয়ে দেখতে পারেন ডট কমান্ড
-- WAL চালু করে পরীক্ষা
PRAGMA journal_mode = WAL;
INSERT INTO COMPANY VALUES (11, 'Hasan', 30, 'Dhaka', 55000);
SELECT * FROM COMPANY;
-- table_info দিয়ে কলাম চেক
PRAGMA table_info('COMPANY');
-- ইউজার ভার্সন সেট ও দেখুন
PRAGMA user_version = 2026;
PRAGMA user_version;
পরবর্তী পর্বে
আমরা SQLite-তে Constraints নিয়ে বিস্তারিত শিখব – প্রাইমারি কি, ফরেন কি, ইউনিক, চেক, নট নাল ইত্যাদি।
লেখকের কথা: PRAGMA হল SQLite-র অন্দরমহলের চাবি। সঠিক ব্যবহার আপনার ডাটাবেসকে দ্রুত ও নিরাপদ করে তুলবে। বাংলায় এই টিউটোরিয়াল সিরিজ এগিয়ে নিতে আপনার শেয়ার, কমেন্ট ও সাবস্ক্রাইব আমাদের কাছে অমূল্য। ToLearnTeam.com-এ চোখ রাখুন নিয়মিত নতুন পর্বের জন্য। প্রশ্ন থাকলে কমেন্টে জানান – আমরা উত্তর দিতে প্রস্তুত!
SQLite Full Course
- SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
- SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
- SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
- SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
- SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
- SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
- SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
- SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
- SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
- SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
- SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
- SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
- SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
- SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
- SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
- SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
- SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
- SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
- SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
- SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
- SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
- SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
- SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
- SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
- SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
- SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
- SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
- SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
- SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
- SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
- SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
- SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
- SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
- SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
- SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
- SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
- SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
- SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
- SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
- SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
- SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
- SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
- SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
- SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
- SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
- SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
- SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
- SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
- SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
- SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)
