SQLite সাধারণত একটি মাত্র ডাটাবেস ফাইল নিয়ে কাজ করলেও, অনেক সময় আমাদের একই সেশনে একাধিক ডাটাবেস অ্যাক্সেস করার প্রয়োজন পড়ে। যেমন একটি ডাটাবেসে ইউজার তথ্য, আরেকটিতে প্রোডাক্ট ক্যাটালগ – একসাথে জয়েন করে রিপোর্ট তৈরি করা। SQLite-এর ATTACH DATABASE কমান্ড ঠিক এই কাজটিই করে। এটি এক কানেকশনের অধীনে আরেকটি (বা একাধিক) ডাটাবেস ফাইল যুক্ত করে, যাতে আপনি একটি মাত্র sqlite3 শেল বা প্রোগ্রাম কানেকশন থেকেই সবগুলো ডাটাবেসের টেবিল ব্যবহার করতে পারেন। আজ আমরা এই ফিচারটি উদাহরণসহ শিখব।
পূর্বপ্রস্তুতি
- আপনার সিস্টেমে SQLite ইন্সটল থাকতে হবে।
- টার্মিনাল/কমান্ড প্রম্পট খোলা থাকতে হবে।
- কোনো বাড়তি প্যাকেজের দরকার নেই।
১. ATTACH DATABASE কেন প্রয়োজন?
ধরুন আপনার কাছে users.db এবং orders.db নামে দুটি আলাদা ডাটাবেস আছে। আপনি যদি একসাথে SELECT * FROM users JOIN orders ... করতে চান, তাহলে কোনো একটি ডাটাবেস খোলার পর আরেকটিকে attach করতে হবে। ATTACH করার পর আপনি অ্যালিয়াস (ছদ্মনাম) দিয়ে অন্য ডাটাবেসের টেবিল উল্লেখ করতে পারবেন। যেমন:
sql
ATTACH DATABASE 'users.db' AS u; ATTACH DATABASE 'orders.db' AS o; SELECT u.users.name, o.orders.total FROM u.users JOIN o.orders ON u.users.id = o.orders.user_id;
এটি খুবই শক্তিশালী – বিভিন্ন ফাইলে থাকা তথ্য মিলিয়ে কোয়েরি করতে আপনাকে আলাদা করে ইম্পোর্ট/এক্সপোর্ট করতে হয় না।
২. ATTACH DATABASE-এর সিনট্যাক্স
sql
ATTACH DATABASE 'FileName' AS 'Alias-Name';
- ‘FileName’ – ডাটাবেস ফাইলের পাথ (যদি একই ফোল্ডারে থাকে, শুধু নাম দিলেই চলবে; অন্যথায় সম্পূর্ণ পাথ)।
- ‘Alias-Name’ – একটি অর্থপূর্ণ ছদ্মনাম, যা দিয়ে আপনি সংযুক্ত ডাটাবেসের টেবিল উল্লেখ করবেন। নামটি ইউনিক হতে হবে এবং SQLite-এর সংরক্ষিত নাম (
main,temp) ব্যবহার করা যাবে না।
গুরুত্বপূর্ণ: যদি উল্লেখিত ফাইলটি আগে থেকে না থাকে, তাহলে SQLite স্বয়ংক্রিয়ভাবে নতুন একটি ডাটাবেস ফাইল তৈরি করবে এবং সেটি সংযুক্ত করবে। যদি থাকে, তবে শুধু সংযুক্ত করবে।
৩. ব্যবহারিক উদাহরণ – ধাপে ধাপে
আমরা একটি দৃশ্যকল্প তৈরি করি: main.db-তে শিক্ষার্থীদের রেজাল্ট, এবং extra.db-তে তাদের সহশিক্ষা কার্যক্রমের তথ্য। আমরা main.db খুলে extra.db-কে attach করব, এবং দুই ডাটাবেস মিলিয়ে রিপোর্ট দেখব।
ধাপ ১: প্রথম ডাটাবেস তৈরি ও ডেটা সংযোজন
bash
sqlite3 main.db
sql
-- শিক্ষার্থী টেবিল
CREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT,
roll INTEGER
);
INSERT INTO students VALUES (1, 'রাহিম', 1001), (2, 'করিম', 1002), (3, 'সুমন', 1003);
-- রেজাল্ট টেবিল
CREATE TABLE results (
student_id INTEGER,
subject TEXT,
marks INTEGER
);
INSERT INTO results VALUES (1, 'গণিত', 85), (1, 'বাংলা', 90), (2, 'গণিত', 78);
.quit দিয়ে বেরিয়ে আসুন। এখন main.db তৈরি।
ধাপ ২: দ্বিতীয় ডাটাবেস তৈরি ও ডেটা সংযোজন
bash
sqlite3 extra.db
sql
CREATE TABLE activities (
student_id INTEGER,
activity TEXT
);
INSERT INTO activities VALUES (1, 'বিতর্ক'), (2, 'ক্রিকেট'), (3, 'সঙ্গীত');
.quit দিয়ে বেরিয়ে আসুন। এখন extra.db তৈরি।
ধাপ ৩: ATTACH করে একসাথে ব্যবহার
আবার main.db খুলি:
bash
sqlite3 main.db
এবার extra.db-কে ext অ্যালিয়াস দিয়ে attach করি:
sql
ATTACH DATABASE 'extra.db' AS ext;
যাচাই করি সংযুক্তি:
sql
.databases
আউটপুট হবে এরকম:
text
seq name file --- --------------- ---------------------- 0 main /path/to/main.db 2 ext /path/to/extra.db
(এখানে seq 1 হলো temp ডাটাবেস, যা স্বয়ংক্রিয়ভাবে থাকে।)
এখন আমরা দুই ডাটাবেসের টেবিল একসাথে ব্যবহার করব। প্রথমে .tables দেখলেই সব টেবিল:
sql
.tables -- output: students results ext.activities
ext.activities – ext অ্যালিয়াস প্রিফিক্সসহ দেখা যাচ্ছে। এখন ক্রস-ডাটাবেস কোয়েরি:
sql
SELECT s.name, s.roll, r.subject, r.marks, a.activity FROM students s JOIN results r ON s.id = r.student_id JOIN ext.activities a ON s.id = a.student_id;
এই একটি কোয়েরি তিনটি টেবিল (দুটি main-এর, একটি ext-এর) একত্রে তথ্য বের করে আনবে। কত সহজ!
৪. DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করা
যদি কোনো ডাটাবেস আর দরকার না হয়, তবে DETACH করতে পারেন:
sql
DETACH DATABASE ext;
এর পর .databases দিলে শুধু main ও temp থাকবে। টেবিলের অ্যাক্সেস আর থাকবে না।
৫. main এবং temp – সংরক্ষিত নাম
SQLite প্রতিটি কানেকশনে দুটি বিশেষ ডাটাবেস রিজার্ভ রাখে:
- main – মূল ডাটাবেস, যেটি আপনি
sqlite3 filenameদিয়ে খুলেছেন। এর নাম পরিবর্তন করা যায় না। - temp – অস্থায়ী টেবিল ও অন্যান্য অস্থায়ী অবজেক্ট রাখার জন্য। প্রতিটি কানেকশনেই এটি থাকে।
আপনি যদি ATTACH DATABASE-তে অ্যালিয়াস হিসেবে main বা temp ব্যবহার করার চেষ্টা করেন, তাহলে এরর পাবেন:
sql
ATTACH DATABASE 'another.db' AS main; -- Error: database main is already in use ATTACH DATABASE 'another.db' AS temp; -- Error: database temp is already in use
সুতরাং, সবসময় main ও temp ছাড়া অন্য নাম বেছে নিন।
৬. ডিরেক্টরি স্ট্রাকচার
উপরের উদাহরণের পর আপনার ফোল্ডারে ফাইলগুলো থাকবে:
text
project/ ├── main.db (প্রথম ডাটাবেস) └── extra.db (দ্বিতীয় ডাটাবেস, যা আমরা attach করেছি)
যখনই ATTACH করবেন, তখন আসল ফাইলটি অপরিবর্তিত থাকে; কেবল সংযোগ যুক্ত হয়। আপনি চাইলে extra.db আলাদাভাবেও sqlite3 extra.db দিয়ে খুলতে পারবেন, তাতে কোনো সমস্যা নেই।
প্যাকেজ/বিশেষ নির্দেশনা: শুধুমাত্র SQLite কমান্ড-লাইন টুলই যথেষ্ট। প্রোগ্রামিং ল্যাঙ্গুয়েজে (Python, Node.js ইত্যাদি) ATTACH একইভাবে SQL কমান্ড পাঠিয়ে করা যায়, কোনো আলাদা লাইব্রেরি লাগে না।
৭. গুরুত্বপূর্ণ টিপস
- অ্যালিয়াস নাম: ছোট ও অর্থপূর্ণ নাম দিন, যেমন
u,o,log– যাতে কোয়েরিতে টেবিল রেফারেন্স সহজ হয় (যেমনu.users,log.events)। - পাথ: সম্ভব হলে সম্পূর্ণ পাথ ব্যবহার করুন, বিশেষ করে যদি ডাটাবেস ফাইল ভিন্ন ফোল্ডারে থাকে। যেমন:sqlATTACH DATABASE ‘/home/user/data/sales.db’ AS sales;
- একাধিক ATTACH: একসাথে একাধিক ডাটাবেস attach করা যায় (সিস্টেমের লিমিটের উপর নির্ভর করে, কিন্তু বাস্তবে ১০-১৫টি পর্যন্ত নির্ভার)।
- লেনদেন (Transaction): ATTACH করার পর মূল ডাটাবেস ও সংযুক্ত ডাটাবেস একই ট্রানজ্যাকশনের আওতায় থাকে। অর্থাৎ COMMIT/ROLLBACK সবগুলো ডাটাবেসে একসাথে কার্যকর হয়। ডেটা ইন্টিগ্রিটি বজায় রাখতে এটি সাহায্য করে।
- একই টেবিলের নাম: যদি দুই ডাটাবেসে একই নামের টেবিল থাকে, তাহলে টেবিল উল্লেখের সময় অ্যালিয়াস দিয়ে আলাদা করতে হবে –
main.studentsএবংext.students। অন্যথায়, প্রিফিক্স ছাড়া শুধুstudentsলিখলে মূল ডাটাবেসের টেবিলকে বুঝাবে।
৮. প্রোগ্রামিং ল্যাঙ্গুয়েজ থেকে ATTACH DATABASE (সংক্ষেপ)
Python-এর sqlite3 মডিউলে:
python
import sqlite3
conn = sqlite3.connect('main.db')
conn.execute("ATTACH DATABASE 'extra.db' AS ext")
cursor = conn.cursor()
cursor.execute("SELECT * FROM ext.activities")
print(cursor.fetchall())
conn.close()
একই প্যাটার্ন অন্যান্য ভাষাতেও (Node.js, Java, C#) প্রযোজ্য – শুধু ATTACH SQL কমান্ডটি এক্সিকিউট করে নিলেই হয়।
পরবর্তী পর্বে
আমরা SQLite-এর CREATE TABLE স্টেটমেন্ট নিয়ে বিস্তারিত শিখব – ডেটা টাইপ, প্রাইমারি কি, অটোইনক্রিমেন্ট, কনস্ট্রেইন্ট ও টেবিল ডিজাইনের বেস্ট প্র্যাকটিস।
লেখকের কথা: বাংলায় 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 – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)
