SQLite Full Course Archives - To Learn Team https://tolearnteam.com/category/computer-programming/sqlite-full-course/ Learn about Everything Online Sat, 08 Aug 2026 04:51:07 +0000 en-US hourly 1 https://wordpress.org/?v=7.1.2 https://tolearnteam.com/wp-content/uploads/2026/07/cropped-Logo-32x32.png SQLite Full Course Archives - To Learn Team https://tolearnteam.com/category/computer-programming/sqlite-full-course/ 32 32 SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড) https://tolearnteam.com/sqlite-quick-guide-bangla/ Sat, 08 Aug 2026 04:25:39 +0000 http://tolearnteam.com/?p=2255 SQLite একটি স্বয়ংসম্পূর্ণ, সার্ভারবিহীন, জিরো-কনফিগারেশন, ট্রানজ্যাকশনাল SQL ডাটাবেস ইঞ্জিন। এটি বিশ্বের সবচেয়ে বেশি ব্যবহৃত ডাটাবেস, মোবাইল অ্যাপ, এমবেডেড সিস্টেম ও ডেস্কটপ সফটওয়্যারে জনপ্রিয়। সম্পূর্ণ ডাটাবেস একটি মাত্র ফাইলে সংরক্ষিত হয়, যা…

The post SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড) appeared first on To Learn Team.

]]>
SQLite একটি স্বয়ংসম্পূর্ণ, সার্ভারবিহীন, জিরো-কনফিগারেশন, ট্রানজ্যাকশনাল SQL ডাটাবেস ইঞ্জিন। এটি বিশ্বের সবচেয়ে বেশি ব্যবহৃত ডাটাবেস, মোবাইল অ্যাপ, এমবেডেড সিস্টেম ও ডেস্কটপ সফটওয়্যারে জনপ্রিয়। সম্পূর্ণ ডাটাবেস একটি মাত্র ফাইলে সংরক্ষিত হয়, যা সহজে কপি ও স্থানান্তরযোগ্য। এই গাইড SQLite-এর প্রাথমিক থেকে অ্যাডভান্সড সব বিষয় সংক্ষেপে ধারণ করে।


১. ইন্সটলেশন

  • উইন্ডোজ: sqlite.org/download.html থেকে sqlite-tools-win-x64-*.zip ডাউনলোড করুন, আনজিপ করে C:\sqlite ফোল্ডারে রাখুন এবং PATH এ যুক্ত করুন। কমান্ড প্রম্পটে sqlite3 লিখুন।
  • ম্যাক (Homebrew): brew install sqlite3
  • লিনাক্স: sudo apt install sqlite3 (ডেবিয়ান/উবুন্টু) অথবা sudo dnf install sqlite (ফেডোরা)।

ইন্সটল যাচাই: sqlite3 --version


২. ডট কমান্ড (Shell-এ বিশেষ কমান্ড)

SQLite শেলে ডট কমান্ড . দিয়ে শুরু হয় এবং সেমিকোলন ছাড়া চলে।

কমান্ডকাজ
.helpসব ডট কমান্ডের তালিকা
.databasesসংযুক্ত ডাটাবেসের তালিকা
.tablesটেবিলের তালিকা
.schema TABLEটেবিলের CREATE স্টেটমেন্ট
.dumpসম্পূর্ণ ডাটাবেস SQL আকারে এক্সপোর্ট
.mode column / .headers onকলাম মোড ও হেডার চালু
.quit / .exitশেল থেকে বের হওয়া

আউটপুট ফরম্যাট: .mode csv, .mode html, .mode insert, .mode line, .mode list, .mode tabs, .mode column


৩. SQL সিনট্যাক্স বেসিক

  • কেস ইনসেনসিটিভ: SELECT ও select একই।
  • কমেন্ট: -- single line অথবা /* multi line */
  • স্টেটমেন্ট শেষে সেমিকোলন: ; বাধ্যতামূলক।

৪. ডেটা টাইপ ও স্টোরেজ ক্লাস

SQLite-র ৫টি স্টোরেজ ক্লাস: NULL, INTEGER, REAL, TEXT, BLOB।
টাইপ অ্যাফিনিটি: TEXT, NUMERIC, INTEGER, REAL, NONE।

সাধারণ ডেটা টাইপ নাম: INT, INTEGER, TEXT, REAL, BLOB, BOOLEAN (আসলে INTEGER 0/1)।

sql

CREATE TABLE demo (
   id INTEGER PRIMARY KEY,
   name TEXT,
   price REAL,
   photo BLOB,
   is_active BOOLEAN DEFAULT 1
);

৫. ডাটাবেস তৈরি ও খোলা

bash

sqlite3 mydb.db

ডাটাবেস তৈরি ও খোলে। ফাইল না থাকলে অটো-ক্রিয়েট হয়।
ATTACH DATABASE 'other.db' AS other; দিয়ে একাধিক ডাটাবেস সংযুক্ত করা যায়।
DETACH DATABASE other; দিয়ে বিচ্ছিন্ন।


৬. টেবিল তৈরি (CREATE TABLE)

sql

CREATE TABLE students (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    roll INTEGER UNIQUE,
    marks REAL DEFAULT 0.0
);
  • PRIMARY KEY ইউনিক ও নট-নাল নিশ্চিত করে (INTEGER PRIMARY KEY হলে rowid-এর অ্যালিয়াস)।
  • AUTOINCREMENT শুধুমাত্র INTEGER PRIMARY KEY-তে।

টেবিল পরিবর্তন:

  • ALTER TABLE students RENAME TO learners; (নাম বদল)
  • ALTER TABLE students ADD COLUMN email TEXT; (নতুন কলাম যোগ)

কনস্ট্রেইন্ট: NOT NULL, DEFAULT, UNIQUE, CHECK, PRIMARY KEY, FOREIGN KEY (ফরেন কি পরে)।

sql

CREATE TABLE employee (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    age INTEGER CHECK(age >= 18),
    salary REAL DEFAULT 50000
);

৭. ডেটা ইনসার্ট (INSERT)

sql

INSERT INTO students (name, roll, marks) VALUES ('রহিম', 101, 85.5);
-- অথবা কলাম ছাড়া (সব কলামের জন্য):
INSERT INTO students VALUES (NULL, 'করিম', 102, 92.0);
-- একাধিক:
INSERT INTO students (name, roll, marks) VALUES
   ('সুমন', 103, 78.25),
   ('জামাল', 104, 88.0);

৮. ডেটা অনুসন্ধান (SELECT)

সমস্ত কলাম: SELECT * FROM students;
নির্দিষ্ট কলাম: SELECT name, marks FROM students;
শর্ত: WHERE marks > 80
প্যাটার্ন: WHERE name LIKE 'ক%' (% যেকোনো অক্ষর, _ এক অক্ষর)
কেস-সেনসিটিভ GLOB: WHERE name GLOB 'K*' (* যেকোনো, ? এক অক্ষর)
রেঞ্জ: WHERE marks BETWEEN 70 AND 90
তালিকা: WHERE roll IN (101, 102, 103)
NULL চেক: WHERE address IS NULL
একাধিক শর্ত: AND, OR, NOT

সর্টিং: ORDER BY marks DESC (ASC ডিফল্ট)
সীমা: LIMIT 5 OFFSET 2 (তৃতীয় সারি থেকে ৫টি রেকর্ড)
ডুপ্লিকেট বাদ: SELECT DISTINCT city FROM students;

গ্রুপিং ও অ্যাগ্রিগেট:

sql

SELECT city, COUNT(*), AVG(marks) FROM students GROUP BY city HAVING COUNT(*) > 2;
  • COUNT, SUM, AVG, MAX, MIN ব্যবহার করুন।
  • GROUP BY-র পরে ফিল্টার HAVING।

৯. ডেটা আপডেট (UPDATE)

sql

UPDATE students SET marks = 90.5 WHERE roll = 101;
UPDATE students SET marks = marks + 5 WHERE city = 'ঢাকা';

সতর্কতা: WHERE ছাড়া সব সারি আপডেট হবে।


১০. ডেটা ডিলিট (DELETE)

sql

DELETE FROM students WHERE roll = 104;
DELETE FROM students; -- সম্পূর্ণ টেবিল খালি করবে!

পুরো টেবিল দ্রুত খালি করতে: DROP TABLE students; ও পুনরায় তৈরি, বা VACUUM পরে ডিলিট।


১১. জয়েন (JOIN)

ধরা যাক দুটি টেবিল: students(id, name) ও results(student_id, subject, marks)।

  • INNER JOIN: মিল পাওয়া সারি।sqlSELECT s.name, r.subject, r.marks FROM students s INNER JOIN results r ON s.id = r.student_id;
  • LEFT JOIN: বাম টেবিলের সব সারি + মিল না থাকলে ডানের কলামে NULL।sqlSELECT * FROM students s LEFT JOIN results r ON s.id = r.student_id;
  • CROSS JOIN: কার্তেসীয় গুণফল (সব কম্বিনেশন)।sqlSELECT * FROM students CROSS JOIN results;

১২. সাবকোয়েরি (Subquery)

sql

SELECT name FROM students
WHERE id IN (SELECT student_id FROM results WHERE subject='গণিত');
-- স্কেলার:
SELECT name FROM students WHERE marks = (SELECT MAX(marks) FROM students);

১৩. ইউনিয়ন (UNION)

দুটি SELECT-এর ফলাফল উল্লম্বভাবে জোড়া (ডুপ্লিকেট সরায়), UNION ALL সরায় না।

sql

SELECT name FROM students WHERE city = 'ঢাকা'
UNION
SELECT name FROM students WHERE marks > 80;

১৪. ট্রানজ্যাকশন

ডেটা ইন্টিগ্রিটি নিশ্চিত করতে।

sql

BEGIN;  -- ট্রানজ্যাকশন শুরু
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;
COMMIT; -- বা ROLLBACK; (বাতিল করতে)

১৫. ইনডেক্স (Index)

অনুসন্ধানের গতি বাড়ায়।

sql

CREATE INDEX idx_name ON students (name);
CREATE UNIQUE INDEX idx_roll ON students (roll);
DROP INDEX idx_name;
  • ইনডেক্স তালিকা: .indices students বা PRAGMA index_list('students')
  • EXPLAIN QUERY PLAN SELECT ... দিয়ে প্ল্যান দেখা যায়।

১৬. ভিউ (View)

ভার্চুয়াল টেবিল।

sql

CREATE VIEW top_students AS
SELECT name, marks FROM students WHERE marks >= 80;

SELECT * FROM top_students;
DROP VIEW top_students;

ভিউ শুধুমাত্র পঠনযোগ্য।


১৭. ট্রিগার (Trigger)

স্বয়ংক্রিয় কাজ।

sql

CREATE TRIGGER log_insert AFTER INSERT ON students
BEGIN
    INSERT INTO audit_log (action, time) VALUES ('INSERT', datetime('now'));
END;
-- DELETE, UPDATE-তেও।
DROP TRIGGER log_insert;

১৮. বিল্ট-ইন ফাংশন

গণনা: COUNT(*), AVG(col), SUM(col), MAX(col), MIN(col)
স্ট্রিং: UPPER(text), LOWER(text), LENGTH(text)
গাণিতিক: ABS(x), ROUND(x, d)
এলোমেলো: RANDOM() (বড় রেঞ্জ), ABS(RANDOM() % 100) (0-99)
তারিখ/সময়:

sql

SELECT date('now');                 -- '2025-08-08'
SELECT time('now');                 -- '14:30:05'
SELECT datetime('now');             -- '2025-08-08 14:30:05'
SELECT julianday('now');            -- জুলিয়ান ডে
SELECT strftime('%d/%m/%Y','now');  -- কাস্টম ফরম্যাট
  • মডিফায়ার: '+1 day', 'start of month', 'weekday 0' ইত্যাদি।

১৯. PRAGMA

ডাটাবেস সেটিংস ও মেটাডেটা।

sql

PRAGMA table_info('students');      -- কলামের তথ্য
PRAGMA index_list('students');      -- ইনডেক্স তালিকা
PRAGMA journal_mode = WAL;          -- জার্নাল মোড (পারফরম্যান্স)
PRAGMA cache_size = 4000;           -- ক্যাশ পেজ সংখ্যা
PRAGMA synchronous = NORMAL;        -- সিঙ্ক মোড
PRAGMA auto_vacuum = FULL; VACUUM;  -- অটো ভ্যাকুয়াম
PRAGMA user_version = 1;            -- ব্যবহারকারী সংস্করণ

২০. AUTOINCREMENT বনাম INTEGER PRIMARY KEY

  • INTEGER PRIMARY KEY (AUTOINCREMENT ছাড়া) → ডিলিট করা rowid পুনরায় ব্যবহার হতে পারে।
  • INTEGER PRIMARY KEY AUTOINCREMENT → কখনো পুরনো মান রিইউজ হয় না, sqlite_sequence টেবিলে রেকর্ড রাখে।

২১. VACUUM

ডাটাবেস ফাইল পুনর্গঠন করে অপ্রয়োজনীয় স্থান মুক্ত করে।

sql

VACUUM;

২২. ব্যাকআপ ও রিস্টোর

bash

sqlite3 mydb.db .dump > backup.sql       # ডাম্প
sqlite3 new.db < backup.sql              # রিস্টোর

অথবা .backup main backup.db (SQLite শেলে)।


২৩. প্রোগ্রামিং ল্যাঙ্গুয়েজে SQLite

পাইথন

python

import sqlite3
conn = sqlite3.connect('mydb.db')
conn.execute("CREATE TABLE ...")
conn.execute("INSERT INTO ... VALUES (?, ?)", (val1, val2))
conn.commit()
conn.close()

জাভা (JDBC)

java

Connection conn = DriverManager.getConnection("jdbc:sqlite:mydb.db");
Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE ...");
ResultSet rs = stmt.executeQuery("SELECT * FROM ...");
conn.close();

(ড্রাইভার JAR: sqlite-jdbc-*.jar)

PHP

php

$db = new SQLite3('mydb.db');
$db->exec("CREATE TABLE ...");
$result = $db->query("SELECT * FROM ...");
while ($row = $result->fetchArray(SQLITE3_ASSOC)) { ... }
$db->close();

C/C++

c

sqlite3 *db;
sqlite3_open("mydb.db", &db);
sqlite3_exec(db, "CREATE TABLE ...", callback, 0, &errMsg);
sqlite3_close(db);

(লিঙ্ক: -lsqlite3)


২৪. SQL ইনজেকশন প্রতিরোধ

কখনোই সরাসরি ইউজার ইনপুট SQL-এ জুড়বেন না।
সবসময় প্যারামিটারাইজড কোয়েরি ব্যবহার করুন: পাইথনে ? বা :name, জাভায় PreparedStatement, পিএইচপিতে prepare ও bindValue।

python

# ভালো
cursor.execute("SELECT * FROM users WHERE name = ?", (user_input,))

২৫. গুরুত্বপূর্ণ টিপস

  • ডাটাবেস ফাইলের ব্যাকআপ নিয়মিত নিন।
  • বড় টেবিলে প্রয়োজনীয় কলামে ইনডেক্স তৈরি করুন।
  • EXPLAIN QUERY PLAN দিয়ে অপ্টিমাইজ করুন।
  • অটো-কমিট বন্ধ করে বাল্ক অপারেশনে একত্রে কমিট করুন (BEGIN; ... COMMIT;)।
  • VACUUM ও PRAGMA সেটিংস প্রয়োজনমতো ব্যবহার করুন।
  • SQLite-র অফিসিয়াল সাইট sqlite.org থেকে সর্বশেষ সংস্করণ ও ডকুমেন্টেশন দেখুন।

এই গাইড SQLite শেখার জন্য দ্রুত একটি রেফারেন্স হিসেবে কাজ করবে। বিস্তারিত প্রতিটি বিষয়ের উপর আমাদের ব্লগে আলাদা টিউটোরিয়াল রয়েছে। বাংলায় প্রযুক্তি শেখার যাত্রায় ToLearnTeam.com আপনার সঙ্গী হোক। শেয়ার করুন, কমেন্টে জানান আপনার প্রশ্ন!



SQLite Full Course

  1. SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
  2. SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
  3. SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
  4. SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
  5. SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
  6. SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
  7. SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
  8. SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
  9. SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
  10. SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
  11. SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
  12. SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
  13. SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
  14. SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
  15. SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
  16. SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  17. SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
  18. SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
  19. SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
  20. SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
  21. SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
  22. SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
  23. SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
  24. SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  25. SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
  26. SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
  27. SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
  28. SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
  29. SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
  30. SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
  31. SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
  32. SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
  33. SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
  34. SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
  35. SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
  36. SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
  37. SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
  38. SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
  39. SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
  40. SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
  41. SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
  42. SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
  43. SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
  44. SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
  45. SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
  46. SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
  47. SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
  48. SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
  49. SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
  50. SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)

The post SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড) appeared first on To Learn Team.

]]>
SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল) https://tolearnteam.com/sqlite-python-programming-bangla/ Sat, 08 Aug 2026 04:19:23 +0000 http://tolearnteam.com/?p=2252 পাইথন প্রোগ্রামারদের জন্য SQLite ব্যবহার করা অত্যন্ত সহজ, কারণ পাইথনের স্ট্যান্ডার্ড লাইব্রেরিতেই sqlite3 নামে একটি মডিউল অন্তর্ভুক্ত আছে (পাইথন 2.5 সংস্করণ থেকে)। এই মডিউল DB-API 2.0 স্পেসিফিকেশন মেনে চলে, ফলে আপনি খুব…

The post SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল) appeared first on To Learn Team.

]]>
পাইথন প্রোগ্রামারদের জন্য SQLite ব্যবহার করা অত্যন্ত সহজ, কারণ পাইথনের স্ট্যান্ডার্ড লাইব্রেরিতেই sqlite3 নামে একটি মডিউল অন্তর্ভুক্ত আছে (পাইথন 2.5 সংস্করণ থেকে)। এই মডিউল DB-API 2.0 স্পেসিফিকেশন মেনে চলে, ফলে আপনি খুব দ্রুত ডাটাবেস সংযোগ স্থাপন, টেবিল তৈরি, ডেটা ইনসার্ট, আপডেট, ডিলিট এবং জিজ্ঞাসা করতে পারেন। আজকের পর্বে আমরা পাইথনে sqlite3-এর প্রধান ফাংশনগুলো, সংযোগ পদ্ধতি, কার্সর ব্যবহার, এবং একটি পূর্ণাঙ্গ CRUD উদাহরণ বাংলায় শিখব।


পূর্বপ্রস্তুতি

  • পাইথন 3.x (বা 2.5+) আপনার সিস্টেমে ইনস্টল থাকতে হবে। আলাদা করে sqlite3 মডিউল ইন্সটল করতে হবে না; এটি পাইথনের সাথে বিল্ট-ইন আসে।
  • কোনো অতিরিক্ত প্যাকেজ বা কনফিগারেশনের প্রয়োজন নেই।
  • আমরা স্ক্রিপ্ট ফাইল .py এক্সটেনশনে সংরক্ষণ করব এবং টার্মিনাল থেকে python filename.py দিয়ে চালাব।

১. sqlite3 মডিউলের গুরুত্বপূর্ণ API

নিচে পাইথনের sqlite3 মডিউলে বহুল ব্যবহৃত ফাংশন ও তাদের সংক্ষিপ্ত বিবরণ দেওয়া হলো।

APIবর্ণনা
sqlite3.connect(database)নির্দিষ্ট ডাটাবেস ফাইলে সংযোগ স্থাপন করে। :memory: দিলে RAM-এ অস্থায়ী ডাটাবেস তৈরি হয়। টাইমআউট সেকেন্ড (ডিফল্ট 5.0) দেওয়া যায়। সংযোগ সফল হলে একটি কানেকশন অবজেক্ট রিটার্ন করে।
connection.cursor()একটি কার্সর অবজেক্ট তৈরি করে, যার মাধ্যমে SQL স্টেটমেন্ট এক্সিকিউট করা হয়।
cursor.execute(sql, params)একটি SQL স্টেটমেন্ট এক্সিকিউট করে। প্যারামিটারাইজড কোয়েরির জন্য ? বা নামযুক্ত প্লেসহোল্ডার (:name) ব্যবহার করা যায়।
connection.execute(sql)সংক্ষিপ্ত রূপ – নিজেই অস্থায়ী কার্সর তৈরি করে execute চালায়।
cursor.executemany(sql, seq)একই SQL স্টেটমেন্ট একাধিক প্যারামিটারের সেটের জন্য বারবার চালায়।
cursor.executescript(sql_script)একাধিক SQL স্টেটমেন্ট (সেমিকোলন দিয়ে পৃথক) একবারে চালায়।
connection.commit()বর্তমান ট্রানজ্যাকশন স্থায়ীভাবে সংরক্ষণ করে।
connection.rollback()শেষ commit()-এর পরের সব পরিবর্তন বাতিল করে।
connection.close()ডাটাবেস সংযোগ বন্ধ করে। খেয়াল রাখবেন, commit() না করে close() করলে পরিবর্তনগুলো হারিয়ে যাবে।
cursor.fetchone()ফলাফলের পরবর্তী একটি সারি টাপল হিসেবে ফেরত দেয়, না থাকলে None।
cursor.fetchmany(size)নির্দিষ্ট সংখ্যক সারির একটি তালিকা ফেরত দেয়।
cursor.fetchall()ফলাফলের বাকি সব সারির তালিকা ফেরত দেয়।
connection.total_changesসংযোগ খোলার পর থেকে মোট কতটি সারি পরিবর্তিত/যুক্ত/মুছে ফেলা হয়েছে।

২. ডাটাবেসে সংযোগ (Connect)

নিচের কোড test.db ডাটাবেস খোলে (যদি না থাকে তবে তৈরি করে) এবং সফল হলে মেসেজ প্রিন্ট করে। আমরা পাইথন 3 স্টাইলে print ফাংশন ব্যবহার করছি।

python

#!/usr/bin/env python3
import sqlite3

conn = sqlite3.connect('test.db')
print("Opened database successfully")
conn.close()

রান করা: python connect.py (অথবা ./connect.py যদি এক্সিকিউটেবল করা থাকে)

আপনার ফোল্ডারে test.db ফাইল তৈরি হবে।


৩. টেবিল তৈরি (CREATE TABLE)

কার্সর তৈরি করে execute() দিয়ে DDL চালানো যায়।

python

import sqlite3

conn = sqlite3.connect('test.db')
print("Opened database successfully")

conn.execute('''CREATE TABLE COMPANY
         (ID INT PRIMARY KEY     NOT NULL,
         NAME           TEXT    NOT NULL,
         AGE            INT     NOT NULL,
         ADDRESS        CHAR(50),
         SALARY         REAL);''')
print("Table created successfully")

conn.close()

একাধিক SQL স্টেটমেন্ট একসাথে executescript() ব্যবহার করে চালাতে পারেন।


৪. INSERT অপারেশন (নিরাপদ প্যারামিটারাইজড)

সরাসরি ভ্যালু জোড়া না দিয়ে প্যারামিটারাইজড কোয়েরি ব্যবহার করুন, যা SQL ইনজেকশন প্রতিরোধ করে। পাইথনের sqlite3-তে ? প্লেসহোল্ডার ব্যবহৃত হয়।

python

import sqlite3

conn = sqlite3.connect('test.db')
print("Opened database successfully")

# প্যারামিটার টাপল
conn.execute("INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY) VALUES (?, ?, ?, ?, ?)",
             (1, 'Paul', 32, 'California', 20000.00))
conn.execute("INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY) VALUES (?, ?, ?, ?, ?)",
             (2, 'Allen', 25, 'Texas', 15000.00))
conn.execute("INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY) VALUES (?, ?, ?, ?, ?)",
             (3, 'Teddy', 23, 'Norway', 20000.00))
conn.execute("INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY) VALUES (?, ?, ?, ?, ?)",
             (4, 'Mark', 25, 'Rich-Mond', 65000.00))

conn.commit()
print("Records created successfully")
conn.close()

executemany() ব্যবহার করে একাধিক ইনসার্ট:

python

data = [
    (5, 'Karim', 30, 'Dhaka', 55000),
    (6, 'Rahim', 28, 'CTG', 48000)
]
conn.executemany("INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY) VALUES (?, ?, ?, ?, ?)", data)
conn.commit()

৫. SELECT অপারেশন

execute() একটি কার্সর রিটার্ন করে যা ইটারেবল; অথবা fetchall() দিয়ে লিস্ট পেতে পারেন।

python

import sqlite3

conn = sqlite3.connect('test.db')
print("Opened database successfully")

cursor = conn.execute("SELECT id, name, address, salary FROM COMPANY")
for row in cursor:
    print("ID =", row[0])
    print("NAME =", row[1])
    print("ADDRESS =", row[2])
    print("SALARY =", row[3], "\n")

print("Operation done successfully")
conn.close()

fetchone() ব্যবহার করে একটি রেকর্ড:

python

cursor = conn.execute("SELECT * FROM COMPANY WHERE ID = 1")
row = cursor.fetchone()
if row:
    print(row)

৬. UPDATE অপারেশন

execute() দিয়ে আপডেট করে commit() করতে হবে। total_changes প্রোপার্টি মোট পরিবর্তিত সারির সংখ্যা দেয়।

python

import sqlite3

conn = sqlite3.connect('test.db')
print("Opened database successfully")

conn.execute("UPDATE COMPANY set SALARY = ? WHERE ID = ?", (25000.00, 1))
conn.commit()
print("Total number of rows updated:", conn.total_changes)

cursor = conn.execute("SELECT id, name, address, salary FROM COMPANY")
for row in cursor:
    print("ID =", row[0])
    print("NAME =", row[1])
    print("ADDRESS =", row[2])
    print("SALARY =", row[3], "\n")

print("Operation done successfully")
conn.close()

৭. DELETE অপারেশন

একইভাবে execute() ও commit()।

python

import sqlite3

conn = sqlite3.connect('test.db')
print("Opened database successfully")

conn.execute("DELETE FROM COMPANY WHERE ID = ?", (2,))
conn.commit()
print("Total number of rows deleted:", conn.total_changes)

cursor = conn.execute("SELECT id, name, address, salary FROM COMPANY")
for row in cursor:
    print("ID =", row[0])
    print("NAME =", row[1])
    print("ADDRESS =", row[2])
    print("SALARY =", row[3], "\n")

print("Operation done successfully")
conn.close()

৮. ডিরেক্টরি স্ট্রাকচার ও প্যাকেজ

আপনার প্রোজেক্ট ফোল্ডারে পাইথন স্ক্রিপ্ট ও ডাটাবেস ফাইল থাকবে:

text

python-sqlite-demo/
├── connect.py
├── create_table.py
├── insert.py
├── select.py
├── update.py
├── delete.py
└── test.db

প্যাকেজ: কোনো আলাদা প্যাকেজ ইন্সটল করতে হবে না। পাইথনের স্ট্যান্ডার্ড লাইব্রেরি sqlite3 মডিউল যথেষ্ট। শুধুমাত্র পাইথন ইন্সটল থাকলেই চলবে।


৯. গুরুত্বপূর্ণ টিপস ও নিরাপত্তা

  • প্যারামিটারাইজড কোয়েরি মাস্ট: কখনোই ইউজার ইনপুট সরাসরি SQL স্ট্রিংয়ে জুড়বেন না। ? বা :name প্লেসহোল্ডার ব্যবহার করুন। এটি SQL ইনজেকশন থেকে রক্ষা করে।
  • commit() ভুলবেন না: INSERT, UPDATE, DELETE-র পর conn.commit() কল না করলে আপনার পরিবর্তন সংরক্ষিত হবে না; প্রোগ্রাম শেষে close() করলে অটো-রোলব্যাক হতে পারে। আপনি conn কে কনটেক্সট ম্যানেজার হিসেবে ব্যবহার করতে পারেন:pythonwith sqlite3.connect(‘test.db’) as conn: conn.execute(“INSERT …”) # with ব্লক শেষে স্বয়ংক্রিয়ভাবে commit() হয় (যদি কোনো এক্সেপশন না ঘটে)
  • কার্সর বন্ধ: কার্সর ব্যবহার শেষে cursor.close() করতে ভুলবেন না, অথবা with স্টেটমেন্ট ব্যবহার করুন:pythonwith conn: conn.execute(sql)
  • ROW ফ্যাক্টরি: কলামের নাম দিয়ে ডেটা অ্যাক্সেস করতে conn.row_factory = sqlite3.Row সেট করুন, তারপর row['NAME'] এভাবে পাবেন।
  • ডেটা টাইপ: পাইথনের None SQLite-এর NULL-এ ম্যাপ হয়।
  • একাধিক থ্রেড: একই সংযোগ একাধিক থ্রেড থেকে ব্যবহার না করাই ভালো। প্রয়োজনে আলাদা সংযোগ তৈরি করুন।

১০. সম্পূর্ণ অনুশীলন (একক স্ক্রিপ্টে CRUD)

নিচের পাইথন স্ক্রিপ্টটি টেবিল তৈরি, ইনসার্ট, সিলেক্ট, আপডেট ও ডিলিট একত্রে করে:

python

import sqlite3

# সংযোগ ও টেবিল তৈরি
conn = sqlite3.connect('test.db')
conn.execute('''CREATE TABLE IF NOT EXISTS COMPANY
               (ID INT PRIMARY KEY NOT NULL,
                NAME TEXT NOT NULL,
                AGE INT NOT NULL,
                ADDRESS CHAR(50),
                SALARY REAL)''')

# ইনসার্ট
conn.execute("INSERT OR REPLACE INTO COMPANY VALUES (1, 'Paul', 32, 'California', 20000)")
conn.execute("INSERT OR REPLACE INTO COMPANY VALUES (2, 'Allen', 25, 'Texas', 15000)")
conn.commit()

# সিলেক্ট
print("All records:")
for row in conn.execute("SELECT * FROM COMPANY"):
    print(row)

# আপডেট
conn.execute("UPDATE COMPANY SET SALARY = 30000 WHERE ID = 1")
print("Rows updated:", conn.total_changes)
conn.commit()

# ডিলিট
conn.execute("DELETE FROM COMPANY WHERE ID = 2")
print("Rows deleted:", conn.total_changes)
conn.commit()

conn.close()

পরবর্তী পর্বে

আমরা SQLite সিরিজের শেষ পর্বে সারাংশ, অন্যান্য ভাষায় SQLite ও শেখার পরবর্তী ধাপ নিয়ে আলোচনা করব।

লেখকের কথা: পাইথন ও SQLite-এর যুগলবন্দি ডেটা-চালিত অ্যাপ্লিকেশন তৈরির সবচেয়ে সহজ রাস্তা। বাংলায় SQLite শেখার এই সিরিজ সমাপ্তির পথে; আপনার আগ্রহ ও সহযোগিতাই আমাদের চালিকাশক্তি। পোস্টটি ভালো লাগলে শেয়ার করুন এবং ToLearnTeam.com সাবস্ক্রাইব করে সব আপডেট নিন। কোনো প্রশ্ন থাকলে কমেন্টে জানান – আমরা উত্তর দিতে প্রস্তুত!



SQLite Full Course

  1. SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
  2. SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
  3. SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
  4. SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
  5. SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
  6. SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
  7. SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
  8. SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
  9. SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
  10. SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
  11. SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
  12. SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
  13. SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
  14. SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
  15. SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
  16. SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  17. SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
  18. SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
  19. SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
  20. SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
  21. SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
  22. SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
  23. SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
  24. SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  25. SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
  26. SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
  27. SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
  28. SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
  29. SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
  30. SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
  31. SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
  32. SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
  33. SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
  34. SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
  35. SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
  36. SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
  37. SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
  38. SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
  39. SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
  40. SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
  41. SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
  42. SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
  43. SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
  44. SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
  45. SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
  46. SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
  47. SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
  48. SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
  49. SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
  50. SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)

The post SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল) appeared first on To Learn Team.

]]>
SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা) https://tolearnteam.com/sqlite-perl-programming-bangla/ Sat, 08 Aug 2026 04:15:56 +0000 http://tolearnteam.com/?p=2249 পার্ল (Perl) একটি শক্তিশালী স্ক্রিপ্টিং ভাষা যা টেক্সট প্রক্রিয়াকরণ, সিস্টেম অ্যাডমিনিস্ট্রেশন, এবং ওয়েব ডেভেলপমেন্টে ব্যাপকভাবে ব্যবহৃত হয়। SQLite-এর সাথে পার্লের যোগাযোগ ঘটে DBI (ডাটাবেস ইন্টারফেস) এবং DBD::SQLite (ডাটাবেস ড্রাইভার) মডিউলের মাধ্যমে। DBI একটি স্ট্যান্ডার্ড…

The post SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা) appeared first on To Learn Team.

]]>
পার্ল (Perl) একটি শক্তিশালী স্ক্রিপ্টিং ভাষা যা টেক্সট প্রক্রিয়াকরণ, সিস্টেম অ্যাডমিনিস্ট্রেশন, এবং ওয়েব ডেভেলপমেন্টে ব্যাপকভাবে ব্যবহৃত হয়। SQLite-এর সাথে পার্লের যোগাযোগ ঘটে DBI (ডাটাবেস ইন্টারফেস) এবং DBD::SQLite (ডাটাবেস ড্রাইভার) মডিউলের মাধ্যমে। DBI একটি স্ট্যান্ডার্ড ডাটাবেস অ্যাক্সেস API সরবরাহ করে, যা বিভিন্ন ডাটাবেসের জন্য একই রকম কোড লিখতে সাহায্য করে। এই পর্বে আমরা পার্লে DBI ইনস্টল করা, ডাটাবেস সংযোগ তৈরি, টেবিল তৈরি, ও CRUD (Create, Read, Update, Delete) অপারেশন উদাহরণসহ সম্পূর্ণ শিখব।


পূর্বপ্রস্তুতি

  • পার্ল ইন্টারপ্রেটার (সাধারণত লিনাক্স/ম্যাকে আগে থেকেই থাকে; উইন্ডোজে Strawberry Perl ইন্সটল করতে পারেন)।
  • DBI ও DBD::SQLite মডিউল ইন্সটল করতে হবে।
  • টার্মিনাল বা কমান্ড প্রম্পট ব্যবহার করতে পারবেন।

১. DBI ও DBD::SQLite ইনস্টলেশন

পার্লে মডিউল ইন্সটলের জন্য cpan (Comprehensive Perl Archive Network) ব্যবহার করা হয়। অথবা ম্যানুয়ালি ডাউনলোড করে কম্পাইল করতে পারেন।

সহজ পদ্ধতি (cpan ব্যবহার করে):

bash

sudo cpan DBI
sudo cpan DBD::SQLite

ম্যানুয়াল ইনস্টলেশন (উদাহরণ):

bash

wget http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.643.tar.gz
tar xvfz DBI-1.643.tar.gz
cd DBI-1.643
perl Makefile.PL
make
make install

wget http://search.cpan.org/CPAN/authors/id/M/MS/MSERGEANT/DBD-SQLite-1.72.tar.gz
tar xvfz DBD-SQLite-1.72.tar.gz
cd DBD-SQLite-1.72
perl Makefile.PL
make
make install

ইন্সটল শেষে পার্ল শেলে perl -MDBI -e 'print "DBI installed\n"' এবং perl -MDBD::SQLite -e 'print "DBD::SQLite installed\n"' দিয়ে পরীক্ষা করতে পারেন।


২. প্রধান DBI API সমূহ

পার্লে SQLite অপারেশনের জন্য নিচের ফাংশনগুলো সবচেয়ে বেশি ব্যবহৃত হয়:

APIবর্ণনা
DBI->connect($dsn, $user, $pass, \%attr)ডাটাবেস সংযোগ স্থাপন করে, ডাটাবেস হ্যান্ডেল ($dbh) রিটার্ন করে। $dsn ফরম্যাট: "DBI:SQLite:dbname=test.db"
$dbh->do($sql)একটি SQL স্টেটমেন্ট তৈরি ও এক্সিকিউট করে। রিটার্ন করে প্রভাবিত সারির সংখ্যা (অথবা -1 যদি অজানা) অথবা ত্রুটিতে undef।
$dbh->prepare($sql)পরবর্তীতে এক্সিকিউট করার জন্য স্টেটমেন্ট প্রস্তুত করে। রিটার্ন করে স্টেটমেন্ট হ্যান্ডেল ($sth)।
$sth->execute()প্রস্তুতকৃত স্টেটমেন্ট এক্সিকিউট করে। সফল হলে true (সারি সংখ্যা নয়), ত্রুটিতে undef।
$sth->fetchrow_array()পরবর্তী সারির ডেটা অ্যারে (list) হিসেবে ফেরত দেয়। NULL ফিল্ড undef হয়।
$DBI::errসর্বশেষ ড্রাইভার মেথড কলের নেটিভ ডাটাবেস ইঞ্জিন এরর কোড।
$DBI::errstrসর্বশেষ DBI মেথড কলের ত্রুটির বর্ণনা (স্ট্রিং)।
$dbh->disconnect()ডাটাবেস সংযোগ বন্ধ করে।

৩. ডাটাবেসে সংযোগ

নিচের কোড test.db নামে একটি SQLite ডাটাবেস খোলে (যদি না থাকে তবে তৈরি করে) এবং সফল হলে মেসেজ দেখায়।

perl

#!/usr/bin/perl

use DBI;
use strict;

my $driver   = "SQLite";
my $database = "test.db";
my $dsn      = "DBI:$driver:dbname=$database";
my $userid   = "";
my $password = "";
my $dbh      = DBI->connect($dsn, $userid, $password, { RaiseError => 1 })
               or die $DBI::errstr;

print "Opened database successfully\n";
$dbh->disconnect();

RaiseError => 1 অ্যাট্রিবিউট দিলে কোনো ত্রুটি ঘটলে স্বয়ংক্রিয়ভাবে die হবে, অন্যথায় ম্যানুয়ালি এরর চেক করতে হবে। :memory: দিলে ইন-মেমোরি ডাটাবেস তৈরি হবে।


৪. টেবিল তৈরি

do() মেথড ব্যবহার করে DDL স্টেটমেন্ট (CREATE, DROP) চালানো হয়।

perl

#!/usr/bin/perl

use DBI;
use strict;

my $driver   = "SQLite";
my $database = "test.db";
my $dsn      = "DBI:$driver:dbname=$database";
my $userid   = "";
my $password = "";
my $dbh      = DBI->connect($dsn, $userid, $password, { RaiseError => 1 })
               or die $DBI::errstr;
print "Opened database successfully\n";

my $stmt = qq(CREATE TABLE COMPANY
   (ID INT PRIMARY KEY     NOT NULL,
      NAME           TEXT    NOT NULL,
      AGE            INT     NOT NULL,
      ADDRESS        CHAR(50),
      SALARY         REAL););

my $rv = $dbh->do($stmt);
if($rv < 0) {
   print $DBI::errstr;
} else {
   print "Table created successfully\n";
}
$dbh->disconnect();

qq() হলো কোট-লাইক অপারেটর, যা ডাবল কোটের মতো কাজ করে এবং মাল্টি-লাইন স্ট্রিং সহজ করে।


৫. INSERT অপারেশন

প্রতিটি INSERT আলাদাভাবে do() দিতে পারেন, অথবা prepare + execute ব্যবহার করতে পারেন (প্যারামিটারাইজডের জন্য ভালো)।

perl

#!/usr/bin/perl

use DBI;
use strict;

my $driver   = "SQLite";
my $database = "test.db";
my $dsn      = "DBI:$driver:dbname=$database";
my $userid   = "";
my $password = "";
my $dbh      = DBI->connect($dsn, $userid, $password, { RaiseError => 1 })
               or die $DBI::errstr;
print "Opened database successfully\n";

my $stmt = qq(INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
               VALUES (1, 'Paul', 32, 'California', 20000.00 ));
my $rv = $dbh->do($stmt) or die $DBI::errstr;

$stmt = qq(INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
               VALUES (2, 'Allen', 25, 'Texas', 15000.00 ));
$rv = $dbh->do($stmt) or die $DBI::errstr;

$stmt = qq(INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
               VALUES (3, 'Teddy', 23, 'Norway', 20000.00 ));
$rv = $dbh->do($stmt) or die $DBI::errstr;

$stmt = qq(INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
               VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 ););
$rv = $dbh->do($stmt) or die $DBI::errstr;

print "Records created successfully\n";
$dbh->disconnect();

৬. SELECT অপারেশন

prepare() ও execute() দিয়ে ডেটা আনা যায়, তারপর fetchrow_array() দিয়ে সারি রিড করা হয়।

perl

#!/usr/bin/perl

use DBI;
use strict;

my $driver   = "SQLite";
my $database = "test.db";
my $dsn      = "DBI:$driver:dbname=$database";
my $dbh      = DBI->connect($dsn, "", "", { RaiseError => 1 })
               or die $DBI::errstr;
print "Opened database successfully\n";

my $stmt = qq(SELECT id, name, address, salary from COMPANY;);
my $sth = $dbh->prepare( $stmt );
my $rv = $sth->execute() or die $DBI::errstr;

while(my @row = $sth->fetchrow_array()) {
      print "ID = ". $row[0] . "\n";
      print "NAME = ". $row[1] ."\n";
      print "ADDRESS = ". $row[2] ."\n";
      print "SALARY =  ". $row[3] ."\n\n";
}
print "Operation done successfully\n";
$dbh->disconnect();

আউটপুটে ৪টি রেকর্ড প্রিন্ট হবে।


৭. UPDATE ও DELETE অপারেশন

এগুলোও do() দিয়ে সহজে করা যায়, এবং do() প্রভাবিত সারির সংখ্যা রিটার্ন করে।

UPDATE:

perl

my $stmt = qq(UPDATE COMPANY set SALARY = 25000.00 where ID=1;);
my $rv = $dbh->do($stmt) or die $DBI::errstr;
print "Total number of rows updated : $rv\n";

DELETE:

perl

my $stmt = qq(DELETE from COMPANY where ID = 2;);
my $rv = $dbh->do($stmt) or die $DBI::errstr;
print "Total number of rows deleted : $rv\n";

পরিবর্তনের পর আবার SELECT দিয়ে যাচাই করে নেওয়া ভালো।


৮. ডিরেক্টরি স্ট্রাকচার

পার্ল স্ক্রিপ্ট ও ডাটাবেস ফাইল একই ফোল্ডারে রাখতে পারেন:

text

perl-sqlite-demo/
├── connect.pl
├── create_table.pl
├── insert.pl
├── select.pl
├── update.pl
├── delete.pl
└── test.db

প্রতিটি .pl ফাইল এক্সিকিউটেবল করতে chmod +x filename.pl দিন অথবা সরাসরি perl filename.pl দিয়ে চালান।

প্রয়োজনীয় প্যাকেজ:

  • DBI (ডাটাবেস ইন্টারফেস)
  • DBD::SQLite (SQLite ড্রাইভার)

কোনো আলাদা SQLite ইন্সটল করার দরকার নেই, কারণ DBD::SQLite নিজেই SQLite লাইব্রেরি বহন করে।


৯. গুরুত্বপূর্ণ টিপস ও সমস্যা সমাধান

  • ত্রুটির বার্তা: DBD::SQLite::st execute failed: not an error(21) at dbdimp.c line 398 – এই ত্রুটির ক্ষেত্রে পুরনো DBD::SQLite সংস্করণের dbdimp.c ফাইলের sqlite3_prepare() ফাংশনের তৃতীয় আর্গুমেন্ট -1 করে পুনরায় কম্পাইল করতে হতে পারে। তবে আধুনিক সংস্করণে এটি ঠিক করা আছে। cpan দিয়ে আপডেটেড DBD::SQLite ইন্সটল করুন।
  • প্যারামিটার বাইন্ডিং: নিরাপত্তার জন্য prepare ও execute-তে প্লেসহোল্ডার (?) ব্যবহার করুন:perlmy $sth = $dbh->prepare(“INSERT INTO COMPANY VALUES (?, ?, ?, ?, ?)”); $sth->execute(5, ‘Karim’, 30, ‘Dhaka’, 50000);
  • do বনাম prepare/execute: do() এককালীন এক্সিকিউশনের জন্য ভালো, বিশেষ করে SELECT বিহীন কমান্ডে। পুনরাবৃত্তিমূলক বা প্যারামিটারাইজড কোয়েরির জন্য prepare/execute ব্যবহার করুন।
  • RaiseError: সংযোগের সময় RaiseError => 1 দিলে প্রতিটি ত্রুটিতে স্বয়ংক্রিয়ভাবে die হবে, ম্যানুয়ালি or die লাগবে না (তবে উভয়ই ব্যবহার করা নিরাপদ)।
  • ফেচিং: fetchrow_array() ছাড়াও fetchrow_hashref() ব্যবহার করে কলাম নাম ধরে ডেটা পাওয়া যায়: $row->{ID}।

১০. সম্পূর্ণ CRUD স্ক্রিপ্ট একত্রে

perl

#!/usr/bin/perl
use DBI;
use strict;

my $dbh = DBI->connect("DBI:SQLite:dbname=test.db", "", "", { RaiseError => 1, AutoCommit => 1 });

# Create
$dbh->do("CREATE TABLE IF NOT EXISTS COMPANY (ID INT PRIMARY KEY, NAME TEXT, AGE INT, ADDRESS TEXT, SALARY REAL)");

# Insert
$dbh->do("INSERT INTO COMPANY VALUES (1, 'Paul', 32, 'California', 20000)");
$dbh->do("INSERT INTO COMPANY VALUES (2, 'Allen', 25, 'Texas', 15000)");

# Select
my $sth = $dbh->prepare("SELECT * FROM COMPANY");
$sth->execute();
while(my @row = $sth->fetchrow_array()) {
    print "ID=$row[0], NAME=$row[1]\n";
}

# Update
$dbh->do("UPDATE COMPANY SET SALARY = 30000 WHERE ID = 1");

# Delete
$dbh->do("DELETE FROM COMPANY WHERE ID = 2");

$dbh->disconnect();

পরবর্তী পর্বে

আমরা SQLite-তে পাইথন প্রোগ্রামিং – Python-এ sqlite3 মডিউল ব্যবহার করে ডাটাবেস অপারেশন শিখব।

লেখকের কথা: পার্ল ও SQLite-এর এই যুগলবন্দি ছোট থেকে মাঝারি অ্যাপ্লিকেশনের জন্য চমৎকার। বাংলায় SQLite সিরিজ সম্প্রসারিত হচ্ছে আপনাদের উৎসাহেই। পোস্টটি ভালো লাগলে শেয়ার করুন, এবং সব আপডেট পেতে ToLearnTeam.com সাবস্ক্রাইব করুন। আপনার প্রশ্ন ও মতামত কমেন্টে জানান – আমরা উত্তর দিতে প্রস্তুত!



SQLite Full Course

  1. SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
  2. SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
  3. SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
  4. SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
  5. SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
  6. SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
  7. SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
  8. SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
  9. SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
  10. SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
  11. SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
  12. SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
  13. SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
  14. SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
  15. SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
  16. SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  17. SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
  18. SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
  19. SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
  20. SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
  21. SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
  22. SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
  23. SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
  24. SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  25. SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
  26. SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
  27. SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
  28. SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
  29. SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
  30. SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
  31. SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
  32. SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
  33. SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
  34. SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
  35. SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
  36. SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
  37. SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
  38. SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
  39. SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
  40. SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
  41. SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
  42. SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
  43. SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
  44. SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
  45. SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
  46. SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
  47. SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
  48. SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
  49. SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
  50. SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)

The post SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা) appeared first on To Learn Team.

]]>
SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল) https://tolearnteam.com/sqlite-php-programming-bangla/ Sat, 08 Aug 2026 04:10:58 +0000 http://tolearnteam.com/?p=2246 পিএইচপি-তে ডাটাবেস ব্যবস্থাপনার জন্য SQLite একটি চমৎকার পছন্দ, কারণ এটি হালকা, সার্ভারবিহীন এবং পিএইচপি 5.3.0 থেকে এক্সটেনশন ডিফল্টভাবে সক্রিয় থাকে। SQLite3 ক্লাস ব্যবহার করে আপনি সহজেই ডাটাবেস ফাইল তৈরি, টেবিল তৈরি, ডেটা…

The post SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল) appeared first on To Learn Team.

]]>
পিএইচপি-তে ডাটাবেস ব্যবস্থাপনার জন্য SQLite একটি চমৎকার পছন্দ, কারণ এটি হালকা, সার্ভারবিহীন এবং পিএইচপি 5.3.0 থেকে এক্সটেনশন ডিফল্টভাবে সক্রিয় থাকে। SQLite3 ক্লাস ব্যবহার করে আপনি সহজেই ডাটাবেস ফাইল তৈরি, টেবিল তৈরি, ডেটা ইনসার্ট, আপডেট, ডিলিট এবং জিজ্ঞাসা করতে পারেন। আজকের পর্বে আমরা পিএইচপিতে SQLite3-এর প্রধান API-গুলো (open, exec, query, fetchArray, changes, close) ব্যবহারিক উদাহরণসহ বিস্তারিত শিখব।


পূর্বপ্রস্তুতি

  • পিএইচপি 5.3.0 বা তার উপরের সংস্করণ ইনস্টল করা থাকতে হবে। (SQLite3 এক্সটেনশন ডিফল্টভাবে চালু থাকে; যদি নাও থাকে তাহলে php.ini-তে extension=sqlite3 লাইনটি আনকমেন্ট করতে হবে।)
  • উইন্ডোজ ব্যবহারকারীদের php_sqlite3.dll সক্রিয় আছে কিনা নিশ্চিত করতে হবে (পিএইচপি 5.3.0 থেকে এটি অন্তর্ভুক্ত)।
  • কোনো অতিরিক্ত প্যাকেজ ডাউনলোডের প্রয়োজন নেই।

১. ডাটাবেসে সংযোগ (Connect to Database)

পিএইচপি-তে SQLite ডাটাবেস খোলার জন্য আমরা SQLite3 ক্লাসের একটি অবজেক্ট তৈরি করি। নিচের উদাহরণে MyDB নামে একটি ক্লাস SQLite3-কে এক্সটেন্ড করে test.db ফাইলটি খুলছে।

php

<?php
   class MyDB extends SQLite3 {
      function __construct() {
         $this->open('test.db');
      }
   }
   $db = new MyDB();
   if(!$db) {
      echo $db->lastErrorMsg();
   } else {
      echo "Opened database successfully\n";
   }
?>

এই কোডটি test.db নামে একটি ডাটাবেস ফাইল তৈরি করবে (যদি না থাকে) এবং একটি সংযোগ স্থাপন করবে। open() মেথডের প্রথম প্যারামিটার হলো ফাইলের নাম। আপনি চাইলে সম্পূর্ণ পাথও দিতে পারেন।

গুরুত্বপূর্ণ পদ্ধতি:

  • open(filename, flags, encryption_key): ডাটাবেস খোলে। :memory: দিলে ইন-মেমোরি ডাটাবেস তৈরি হবে।
  • lastErrorMsg(): সর্বশেষ ত্রুটির বর্ণনা ফেরত দেয়।
  • lastErrorCode(): ত্রুটির সাংখ্যিক কোড ফেরত দেয়।
  • close(): ডাটাবেস সংযোগ বন্ধ করে।

২. টেবিল তৈরি (CREATE TABLE)

টেবিল তৈরি করতে exec() মেথড ব্যবহার করা হয়, যা ফলাফল-হীন (result-less) SQL কমান্ড চালায়।

php

<?php
   class MyDB extends SQLite3 {
      function __construct() {
         $this->open('test.db');
      }
   }
   $db = new MyDB();
   if(!$db) {
      echo $db->lastErrorMsg();
   } else {
      echo "Opened database successfully\n";
   }

   $sql =<<<EOF
      CREATE TABLE COMPANY
      (ID INT PRIMARY KEY     NOT NULL,
      NAME           TEXT    NOT NULL,
      AGE            INT     NOT NULL,
      ADDRESS        CHAR(50),
      SALARY         REAL);
EOF;

   $ret = $db->exec($sql);
   if(!$ret){
      echo $db->lastErrorMsg();
   } else {
      echo "Table created successfully\n";
   }
   $db->close();
?>

এখানে <<<EOF দিয়ে মাল্টি-লাইন স্ট্রিং তৈরি করা হয়েছে। exec() সফল হলে true, নয়তো false রিটার্ন করে।


৩. INSERT অপারেশন

নতুন রেকর্ড যোগ করতে একই exec() ব্যবহার করা যায়। একাধিক INSERT একসাথে চালাতে পারেন।

php

<?php
   class MyDB extends SQLite3 {
      function __construct() {
         $this->open('test.db');
      }
   }
   
   $db = new MyDB();
   if(!$db){
      echo $db->lastErrorMsg();
   } else {
      echo "Opened database successfully\n";
   }

   $sql =<<<EOF
      INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
      VALUES (1, 'Paul', 32, 'California', 20000.00 );

      INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
      VALUES (2, 'Allen', 25, 'Texas', 15000.00 );

      INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
      VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );

      INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
      VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );
EOF;

   $ret = $db->exec($sql);
   if(!$ret) {
      echo $db->lastErrorMsg();
   } else {
      echo "Records created successfully\n";
   }
   $db->close();
?>

৪. SELECT অপারেশন

ডেটা পড়তে query() মেথড ব্যবহার করা হয়, যা একটি SQLite3Result অবজেক্ট ফেরত দেয়। তারপর fetchArray() দিয়ে রেকর্ড ফেচ করা হয়।

php

<?php
   class MyDB extends SQLite3 {
      function __construct() {
         $this->open('test.db');
      }
   }
   
   $db = new MyDB();
   if(!$db) {
      echo $db->lastErrorMsg();
   } else {
      echo "Opened database successfully\n";
   }

   $sql =<<<EOF
      SELECT * from COMPANY;
EOF;

   $ret = $db->query($sql);
   while($row = $ret->fetchArray(SQLITE3_ASSOC) ) {
      echo "ID = ". $row['ID'] . "\n";
      echo "NAME = ". $row['NAME'] ."\n";
      echo "ADDRESS = ". $row['ADDRESS'] ."\n";
      echo "SALARY = ".$row['SALARY'] ."\n\n";
   }
   echo "Operation done successfully\n";
   $db->close();
?>

fetchArray()-এর মোড SQLITE3_ASSOC দিলে associative array ফেরত আসে। SQLITE3_NUM দিলে numeric index, SQLITE3_BOTH দিলে উভয়ই। প্রতিটি fetchArray() কল পরবর্তী সারিতে চলে যায়।


৫. UPDATE অপারেশন

আপডেটের জন্য exec() ব্যবহার করা হয় এবং কতগুলো সারি প্রভাবিত হয়েছে তা জানতে changes() মেথড ব্যবহার করা যায়।

php

<?php
   class MyDB extends SQLite3 {
      function __construct() {
         $this->open('test.db');
      }
   }
   
   $db = new MyDB();
   if(!$db) {
      echo $db->lastErrorMsg();
   } else {
      echo "Opened database successfully\n";
   }
   $sql =<<<EOF
      UPDATE COMPANY set SALARY = 25000.00 where ID=1;
EOF;
   $ret = $db->exec($sql);
   if(!$ret) {
      echo $db->lastErrorMsg();
   } else {
      echo $db->changes(), " Record updated successfully\n";
   }

   // পরিবর্তন যাচাই
   $sql = "SELECT * from COMPANY;";
   $ret = $db->query($sql);
   while($row = $ret->fetchArray(SQLITE3_ASSOC) ) {
      echo "ID = ". $row['ID'] . "\n";
      echo "NAME = ". $row['NAME'] ."\n";
      echo "SALARY = ".$row['SALARY'] ."\n\n";
   }
   $db->close();
?>

৬. DELETE অপারেশন

ডিলিট করতেও exec() এবং changes() ব্যবহার করা যায়।

php

<?php
   class MyDB extends SQLite3 {
      function __construct() {
         $this->open('test.db');
      }
   }
   
   $db = new MyDB();
   if(!$db) {
      echo $db->lastErrorMsg();
   } else {
      echo "Opened database successfully\n";
   }
   $sql =<<<EOF
      DELETE from COMPANY where ID = 2;
EOF;
   
   $ret = $db->exec($sql);
   if(!$ret){
     echo $db->lastErrorMsg();
   } else {
      echo $db->changes(), " Record deleted successfully\n";
   }

   // বাকি রেকর্ড দেখি
   $sql = "SELECT * from COMPANY;";
   $ret = $db->query($sql);
   while($row = $ret->fetchArray(SQLITE3_ASSOC) ) {
      echo "ID = ". $row['ID'] . "\n";
      echo "NAME = ". $row['NAME'] ."\n";
      echo "SALARY = ".$row['SALARY'] ."\n\n";
   }
   $db->close();
?>

৭. ডিরেক্টরি স্ট্রাকচার

উপরের সবগুলো পিএইচপি স্ক্রিপ্ট চালানোর পর আপনার প্রোজেক্ট ফোল্ডারে নিম্নলিখিত ফাইলগুলো থাকবে:

text

php-sqlite-demo/
├── create.php
├── insert.php
├── select.php
├── update.php
├── delete.php
└── test.db

প্রতিটি স্ক্রিপ্ট সরাসরি কমান্ড লাইন থেকে চালানো যায়: php create.php। test.db ফাইলটি ডাটাবেস ধারণ করবে।

প্যাকেজ ইন্সটলেশন: কোনো আলাদা প্যাকেজ লাগবে না, পিএইচপি-র বিল্ট-ইন SQLite3 এক্সটেনশন যথেষ্ট। যদি এক্সটেনশন লোড না থাকে, php.ini-তে extension=sqlite3 লাইন যোগ করতে পারেন।


৮. গুরুত্বপূর্ণ টিপস

  • SQL ইনজেকশন প্রতিরোধ: কখনো সরাসরি ভ্যারিয়েবল জুড়ে SQL স্ট্রিং তৈরি করবেন না। prepare() এবং bindValue() ব্যবহার করে প্যারামিটারাইজড কোয়েরি তৈরি করুন। উদাহরণ:php$stmt = $db->prepare(“INSERT INTO COMPANY VALUES (:id, :name, :age, :addr, :salary)”); $stmt->bindValue(‘:id’, $id, SQLITE3_INTEGER); $stmt->bindValue(‘:name’, $name, SQLITE3_TEXT); // … $stmt->execute();
  • এস্কেপিং: SQLite3::escapeString() ব্যবহার করে স্ট্রিং এস্কেপ করা যায়, তবে এটি Prepared Statement-এর বিকল্প নয়।
  • ত্রুটি ব্যবস্থাপনা: lastErrorMsg() ও lastErrorCode() দিয়ে বিস্তারিত ত্রুটি বার্তা পান। প্রোডাকশনে এগুলো ব্যবহারকারীকে না দেখিয়ে লগ করুন।
  • ডাটাবেস ফাইলের নিরাপত্তা: ওয়েব সার্ভারে test.db ফাইলটি পাবলিক ডিরেক্টরির বাইরে রাখুন অথবা .htaccess দিয়ে সরাসরি অ্যাক্সেস বন্ধ করুন।
  • অন্যান্য ফেচ মোড: fetchArray(SQLITE3_NUM) দিয়ে শুধুমাত্র নাম্বার ইনডেক্সড অ্যারে, SQLITE3_BOTH দিয়ে উভয়ই পাবেন।
  • changes() ফাংশন: শেষ exec() কলে কতটি সারি আপডেট/ইনসার্ট/ডিলিট হয়েছে তা জানতে ব্যবহার করুন।

৯. সম্পূর্ণ অনুশীলন (একক স্ক্রিপ্টে CRUD)

একটি পূর্ণাঙ্গ উদাহরণ একত্রে:

php

<?php
class DB extends SQLite3 {
    function __construct() {
        $this->open('test.db');
    }
}

$db = new DB();
if (!$db) {
    echo "Connection failed.\n";
    exit;
}

// Create table
$db->exec("CREATE TABLE IF NOT EXISTS COMPANY (
    ID INT PRIMARY KEY NOT NULL,
    NAME TEXT NOT NULL,
    AGE INT NOT NULL,
    ADDRESS CHAR(50),
    SALARY REAL
)");

// Insert
$db->exec("DELETE FROM COMPANY"); // পরিষ্কার
$db->exec("INSERT INTO COMPANY VALUES (1, 'Paul', 32, 'California', 20000)");
$db->exec("INSERT INTO COMPANY VALUES (2, 'Allen', 25, 'Texas', 15000)");

// Select
echo "All records:\n";
$result = $db->query("SELECT * FROM COMPANY");
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
    echo "{$row['ID']}: {$row['NAME']} - {$row['SALARY']}\n";
}

// Update
$db->exec("UPDATE COMPANY SET SALARY = 30000 WHERE ID = 1");
echo "Updated rows: " . $db->changes() . "\n";

// Delete
$db->exec("DELETE FROM COMPANY WHERE ID = 2");
echo "Deleted rows: " . $db->changes() . "\n";

$db->close();
?>

পরবর্তী পর্বে

আমরা SQLite সিরিজের সমাপ্তি টানবো SQLite পর্যালোচনা ও পরবর্তী পদক্ষেপ – অন্যান্য ভাষায় SQLite ব্যবহার, উন্নত কৌশল এবং শেখার রিসোর্স নিয়ে।

লেখকের কথা: পিএইচপি-র সাথে SQLite ব্যবহার করা অত্যন্ত সহজ এবং দ্রুত। বাংলায় SQLite শেখার এই সিরিজ সম্পূর্ণ করতে আপনার উৎসাহ আমাদের বড় প্রেরণা। পোস্টটি ভালো লাগলে শেয়ার করুন, এবং সব আপডেট পেতে ToLearnTeam.com সাবস্ক্রাইব করতে ভুলবেন না। কোনো প্রশ্ন বা জিজ্ঞাসা জানাতে কমেন্ট করুন – আমরা উত্তর দিতে প্রস্তুত!



SQLite Full Course

  1. SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
  2. SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
  3. SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
  4. SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
  5. SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
  6. SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
  7. SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
  8. SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
  9. SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
  10. SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
  11. SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
  12. SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
  13. SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
  14. SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
  15. SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
  16. SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  17. SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
  18. SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
  19. SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
  20. SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
  21. SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
  22. SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
  23. SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
  24. SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  25. SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
  26. SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
  27. SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
  28. SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
  29. SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
  30. SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
  31. SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
  32. SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
  33. SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
  34. SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
  35. SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
  36. SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
  37. SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
  38. SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
  39. SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
  40. SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
  41. SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
  42. SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
  43. SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
  44. SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
  45. SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
  46. SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
  47. SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
  48. SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
  49. SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
  50. SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)

The post SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল) appeared first on To Learn Team.

]]>
SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল) https://tolearnteam.com/sqlite-c-cpp-programming-bangla/ Sat, 08 Aug 2026 03:46:54 +0000 http://tolearnteam.com/?p=2243 SQLite-কে শুধু কমান্ড-লাইন নয়, আপনার নিজের সি বা সি++ প্রোগ্রামের ভিতরেও ব্যবহার করতে পারেন। এটি করার জন্য SQLite একটি সহজ C API সরবরাহ করে, যার মাধ্যমে আপনি ডাটাবেস ফাইল তৈরি,…

The post SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল) appeared first on To Learn Team.

]]>
SQLite-কে শুধু কমান্ড-লাইন নয়, আপনার নিজের সি বা সি++ প্রোগ্রামের ভিতরেও ব্যবহার করতে পারেন। এটি করার জন্য SQLite একটি সহজ C API সরবরাহ করে, যার মাধ্যমে আপনি ডাটাবেস ফাইল তৈরি, টেবিল তৈরি, ডেটা ইনসার্ট, আপডেট, ডিলিট এবং কোয়েরি করতে পারবেন। এই পর্বে আমরা ধাপে ধাপে শিখব কীভাবে একটি C প্রোগ্রামে SQLite লাইব্রেরি যুক্ত করতে হয়, প্রয়োজনীয় ফাংশনগুলো ব্যবহার করে ডাটাবেস অপারেশন চালাতে হয়, এবং callback ফাংশনের মাধ্যমে SELECT-এর ফলাফল হ্যান্ডেল করতে হয়।


পূর্বপ্রস্তুতি

  • আপনার সিস্টেমে SQLite3 লাইব্রেরি ইন্সটল থাকতে হবে। উবুন্টু/ডেবিয়ানে sudo apt install libsqlite3-dev, ফেডোরায় sudo dnf install sqlite-devel, উইন্ডোজে SQLite ডাউনলোড পেজ থেকে বাইনারি ও হেডার সংগ্রহ করুন।
  • C কম্পাইলার (gcc) বা C++ কম্পাইলার (g++) থাকতে হবে।
  • সাধারণ C প্রোগ্রামিং জ্ঞান (ফাংশন, পয়েন্টার) থাকলে বুঝতে সুবিধা হবে।

ইন্সটল চেক করতে:

bash

gcc --version
sqlite3 --version

১. C/C++ API মূল ফাংশন

SQLite C API-এর তিনটি প্রধান ফাংশন হলো:

  1. sqlite3_open(const char *filename, sqlite3 **ppDb)
    একটি ডাটাবেস ফাইল খোলে (বা তৈরি করে) এবং একটি ডাটাবেস সংযোগ অবজেক্ট রিটার্ন করে। ফাইলের নাম NULL বা ":memory:" দিলে ইন-মেমোরি ডাটাবেস তৈরি হবে, যা শুধুমাত্র সেশন চলাকালে স্থায়ী।
  2. sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *data, char **errmsg)
    এক বা একাধিক SQL স্টেটমেন্ট এক্সিকিউট করার সহজ উপায়। এর মাধ্যমে আমরা CREATE, INSERT, UPDATE, DELETE, SELECT ইত্যাদি চালাতে পারি। SELECT-এর ফলাফল পেতে তৃতীয় আর্গুমেন্টে একটি callback ফাংশন দিতে হয়, যা প্রতিটি রেকর্ডের জন্য ডাকা হবে। শেষ আর্গুমেন্ট error মেসেজ ধরে রাখে।
  3. sqlite3_close(sqlite3*)
    পূর্বে খোলা ডাটাবেস সংযোগ বন্ধ করে। বন্ধ করার আগে সমস্ত প্রস্তুতকৃত স্টেটমেন্ট ফাইনালাইজ করতে হবে, নয়তো SQLITE_BUSY রিটার্ন করবে।

২. ডাটাবেসে সংযোগ

নিচের কোডটি test.db নামে একটি ডাটাবেস খোলে (যদি না থাকে তবে তৈরি করে) এবং সফল হলে মেসেজ দেখিয়ে বন্ধ করে।

c

#include <stdio.h>
#include <sqlite3.h>

int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;

   rc = sqlite3_open("test.db", &db);

   if( rc ) {
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Opened database successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

কম্পাইল ও চালান:

bash

gcc test.c -l sqlite3
./a.out

আউটপুট: Opened database successfully

এখন আপনার ডিরেক্টরিতে test.db ফাইল তৈরি হবে। -l sqlite3 ফ্ল্যাগ sqlite3 লাইব্রেরি লিঙ্ক করে। C++ হলে g++ ব্যবহার করুন, কমান্ড একই।


৩. টেবিল তৈরি

একটি callback ফাংশন ডিফাইন করে sqlite3_exec-এর মাধ্যমে CREATE TABLE চালাই।

c

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
   int i;
   for(i = 0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}

int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;

   rc = sqlite3_open("test.db", &db);
   if( rc ) {
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      return(0);
   }

   sql = "CREATE TABLE COMPANY("
         "ID INT PRIMARY KEY     NOT NULL,"
         "NAME           TEXT    NOT NULL,"
         "AGE            INT     NOT NULL,"
         "ADDRESS        CHAR(50),"
         "SALARY         REAL );";

   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
   if( rc != SQLITE_OK ){
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Table created successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

কম্পাইল ও চালালে test.db-তে COMPANY টেবিল তৈরি হবে। callback ফাংশন এখানে শুধু প্রিন্ট করবে (যদি কোনো আউটপুট থাকে), কিন্তু CREATE TABLE কোনো রেকর্ড রিটার্ন করে না, তাই callback ডাকা হবে না।


৪. INSERT অপারেশন

একাধিক INSERT একত্রে চালানো যায়, সেমিকোলন দিয়ে পৃথক করে।

c

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
   for(int i=0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}

int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;

   rc = sqlite3_open("test.db", &db);
   if( rc ) {
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      return(0);
   }

   sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
         "VALUES (1, 'Paul', 32, 'California', 20000.00 ); "
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
         "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
         "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 ); "
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
         "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";

   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Records created successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

এটি COMPANY টেবিলে চারটি রেকর্ড যোগ করবে।


৫. SELECT অপারেশন ও callback ফাংশন

SELECT স্টেটমেন্টের ফলাফল পেতে callback ফাংশন ব্যবহার বাধ্যতামূলক। SQLite প্রতিটি রেকর্ডের জন্য এই callback কল করে। নিচের উদাহরণে আমরা SELECT * FROM COMPANY চালাই এবং প্রতিটি সারির কলাম ও মান প্রিন্ট করি।

c

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

static int callback(void *data, int argc, char **argv, char **azColName) {
   fprintf(stderr, "%s: ", (const char*)data);
   for(int i=0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}

int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   const char* data = "Callback function called";

   rc = sqlite3_open("test.db", &db);
   if( rc ) {
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      return(0);
   }

   sql = "SELECT * from COMPANY";
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Operation done successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

আউটপুট:

text

Callback function called: ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 20000.0
...

callback ফাংশনের প্যারামিটার:

  • void *data: user-defined ডাটা, যা sqlite3_exec-এর চতুর্থ আর্গুমেন্ট থেকে আসে।
  • int argc: ওই সারিতে কলাম সংখ্যা।
  • char **argv: কলামগুলোর মান (স্ট্রিং)।
  • char **azColName: কলামগুলোর নাম।

callback ফাংশন 0 রিটার্ন করলে পরবর্তী সারির জন্য আবার ডাকা হয়; অশূন্য রিটার্ন করলে প্রক্রিয়া বন্ধ হয়।


৬. UPDATE ও DELETE অপারেশন

আপডেট ও ডিলিট অপারেশনও sqlite3_exec দিয়েই সম্পন্ন হয়। নিচের উদাহরণে UPDATE এবং সাথে সাথে SELECT দেখানো হয়েছে।

c

// UPDATE
sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1; "
      "SELECT * from COMPANY";
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);

c

// DELETE
sql = "DELETE from COMPANY where ID=2; "
      "SELECT * from COMPANY";
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);

একই কাঠামো ব্যবহার করে আপনি জটিল SQL চালাতে পারবেন। error হ্যান্ডেলিং-এ sqlite3_free(zErrMsg) করতে ভুলবেন না, নাহলে মেমরি লিক হতে পারে।


৭. ডিরেক্টরি স্ট্রাকচার ও ফাইল

আপনার প্রজেক্ট ফোল্ডারে নিম্নোক্ত ফাইলগুলো থাকবে:

text

project-folder/
├── test.c        (C সোর্স ফাইল)
├── a.out         (কম্পাইল্ড এক্সিকিউটেবল)
└── test.db       (SQLite ডাটাবেস ফাইল)

প্রয়োজনীয় প্যাকেজ:

  • উবুন্টু/ডেবিয়ান: libsqlite3-dev
  • ফেডোরা: sqlite-devel
  • উইন্ডোজ: SQLite ডাউনলোড থেকে sqlite3.h, sqlite3.dll, sqlite3.def সংগ্রহ করে MinGW বা Visual Studio প্রজেক্টে সংযুক্ত করুন।

কম্পাইল কমান্ড: gcc -o myapp test.c -lsqlite3


৮. গুরুত্বপূর্ণ টিপস

  • কলব্যাক ছাড়া SELECT: কেবলমাত্র INSERT/UPDATE/DELETE-র জন্য callback NULL দেওয়া যায়; SELECT-র জন্য callback দিতেই হবে। যদি callback না দেন, তবে SELECT-এর ফলাফল পাবেন না, কিন্তু প্রোগ্রাম চলবে।
  • মেমরি ম্যানেজমেন্ট: sqlite3_exec-এ error পেলে zErrMsg কে sqlite3_free() দিয়ে ফ্রি করতে হবে।
  • প্রিপেয়ার্ড স্টেটমেন্ট: প্যারামিটারাইজড কোয়েরির জন্য sqlite3_prepare_v2, sqlite3_bind_*, sqlite3_step ব্যবহার করতে পারেন, যা SQL Injection প্রতিরোধ করে। আমরা শুধু প্রাথমিক API কভার করেছি।
  • স্ট্রিং কনক্যাটেনেশন: C-তে SQL স্ট্রিং বানাতে "..." ও "..." পাশাপাশি লিখে জোড়া যায় (উপরের উদাহরণের মতো), এটি কম্পাইল টাইমে এক হয়ে যায়।
  • একাধিক কমান্ড: সেমিকোলন দিয়ে একাধিক SQL কমান্ড একসাথে চালানো যায়, যেমন INSERT একাধিক। তবে প্রতিটি স্টেটমেন্টের সাফল্য আলাদা; একটি ব্যর্থ হলে sqlite3_exec থেমে যাবে।
  • রিটার্ন কোড চেক: সবসময় rc != SQLITE_OK চেক করে error হ্যান্ডেল করুন। SQLITE_OK-র মান 0।

৯. সম্পূর্ণ অনুশীলন

উপরের কোডগুলো একটি ফাইলে ক্রমান্বয়ে লিখে পরীক্ষা করে দেখতে পারেন। নিচে একটি পূর্ণাঙ্গ প্রোগ্রামের স্কেলিটন দেওয়া হলো যা টেবিল তৈরি, ডেটা ঢোকানো, সিলেক্ট, আপডেট ও ডিলিট করে:

c

#include <stdio.h>
#include <sqlite3.h>

static int callback(void *data, int argc, char **argv, char **azColName) {
    for (int i = 0; i < argc; i++) {
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}

int main() {
    sqlite3 *db;
    char *errMsg = 0;
    int rc = sqlite3_open("test.db", &db);
    if (rc) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        return 1;
    }

    // Create table
    const char *sql_create = "CREATE TABLE IF NOT EXISTS COMPANY(...);";
    rc = sqlite3_exec(db, sql_create, NULL, 0, &errMsg);
    // Handle error...

    // Insert
    const char *sql_insert = "INSERT INTO COMPANY ...";
    rc = sqlite3_exec(db, sql_insert, NULL, 0, &errMsg);

    // Select
    const char *sql_select = "SELECT * FROM COMPANY;";
    rc = sqlite3_exec(db, sql_select, callback, 0, &errMsg);

    sqlite3_close(db);
    return 0;
}

পরবর্তী পর্বে

আমরা শিখব SQLite জাভা প্রোগ্রামিং – জাভা প্রোগ্রামে JDBC বা Android-এ SQLite ব্যবহারের পদ্ধতি।

লেখকের কথা: C/C++ দিয়ে SQLite-কে নিজের অ্যাপ্লিকেশনে জুড়ে দেওয়া এখন আর কঠিন নয়। বাংলায় এই টিউটোরিয়াল সিরিজ এগিয়ে নিতে আপনার মূল্যবান মতামত ও শেয়ার আমাদের উৎসাহিত করে। পোস্টটি ভালো লাগলে বন্ধুদের জানাতে ভুলবেন না! সম্পূর্ণ সিরিজের আপডেট পেতে ToLearnTeam.com সাবস্ক্রাইব করুন। কোনো প্রশ্ন থাকলে কমেন্টে জানান – আমরা উত্তর দিতে প্রস্তুত!



SQLite Full Course

  1. SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
  2. SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
  3. SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
  4. SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
  5. SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
  6. SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
  7. SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
  8. SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
  9. SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
  10. SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
  11. SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
  12. SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
  13. SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
  14. SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
  15. SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
  16. SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  17. SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
  18. SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
  19. SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
  20. SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
  21. SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
  22. SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
  23. SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
  24. SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  25. SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
  26. SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
  27. SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
  28. SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
  29. SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
  30. SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
  31. SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
  32. SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
  33. SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
  34. SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
  35. SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
  36. SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
  37. SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
  38. SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
  39. SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
  40. SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
  41. SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
  42. SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
  43. SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
  44. SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
  45. SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
  46. SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
  47. SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
  48. SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
  49. SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
  50. SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)

The post SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল) appeared first on To Learn Team.

]]>
SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল) https://tolearnteam.com/sqlite-useful-functions-bangla/ Sat, 08 Aug 2026 03:43:51 +0000 http://tolearnteam.com/?p=2240 SQLite ডেটা বিশ্লেষণ ও প্রক্রিয়াকরণের জন্য অনেকগুলো বিল্ট-ইন ফাংশন সরবরাহ করে। এদের মধ্যে আছে সারি গণনা করা, যোগফল বের করা, সর্বোচ্চ-সর্বনিম্ন মান খোঁজা, স্ট্রিংকে বড়/ছোট হাতের অক্ষরে রূপান্তর করা, র‍্যান্ডম…

The post SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল) appeared first on To Learn Team.

]]>
SQLite ডেটা বিশ্লেষণ ও প্রক্রিয়াকরণের জন্য অনেকগুলো বিল্ট-ইন ফাংশন সরবরাহ করে। এদের মধ্যে আছে সারি গণনা করা, যোগফল বের করা, সর্বোচ্চ-সর্বনিম্ন মান খোঁজা, স্ট্রিংকে বড়/ছোট হাতের অক্ষরে রূপান্তর করা, র‍্যান্ডম সংখ্যা তৈরি ইত্যাদি। এই ফাংশনগুলো কেস-ইনসেনসিটিভ, অর্থাৎ COUNT, count, বা Count—সবই একইভাবে কাজ করে। আজকের পর্বে আমরা বেশ কিছু গুরুত্বপূর্ণ বিল্ট-ইন ফাংশন উদাহরণসহ শিখব এবং আমাদের পরিচিত COMPANY টেবিলের ওপর তাদের প্রয়োগ দেখব।


পূর্বপ্রস্তুতি

  • SQLite ইন্সটল থাকতে হবে (সিরিজের ৩য় পর্ব দেখুন)।
  • আমরা COMPANY টেবিল পুনরায় ব্যবহার করব। functions_demo.db নামে ডাটাবেস বানাই।

টার্মিনাল:

bash

sqlite3 functions_demo.db

sql

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY NOT NULL,
   NAME TEXT NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR(50),
   SALARY REAL
);

INSERT INTO COMPANY VALUES (1, 'Paul', 32, 'California', 20000.00);
INSERT INTO COMPANY VALUES (2, 'Allen', 25, 'Texas', 15000.00);
INSERT INTO COMPANY VALUES (3, 'Teddy', 23, 'Norway', 20000.00);
INSERT INTO COMPANY VALUES (4, 'Mark', 25, 'Rich-Mond', 65000.00);
INSERT INTO COMPANY VALUES (5, 'David', 27, 'Texas', 85000.00);
INSERT INTO COMPANY VALUES (6, 'Kim', 22, 'South-Hall', 45000.00);
INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00);
  • আউটপুট ফরম্যাট: .header on, .mode column।

১. COUNT ফাংশন – সারির সংখ্যা গণনা

কোনো টেবিলে মোট কতটি সারি আছে, বা নির্দিষ্ট শর্তে কতটি সারি আছে, তা জানতে COUNT ব্যবহৃত হয়। COUNT(*) সব সারি (NULL সহ) গণনা করে; COUNT(column) শুধু not-null মান গণনা করে।

sql

SELECT COUNT(*) FROM COMPANY;

ফলাফল: 7

sql

SELECT COUNT(SALARY) FROM COMPANY WHERE SALARY > 30000;

ফলাফল: 3 (Mark, David, Kim)


২. MAX ও MIN ফাংশন – সর্বোচ্চ ও সর্বনিম্ন মান

একটি কলামের সবচেয়ে বড় ও ছোট মান বের করতে।

MAX:

sql

SELECT MAX(SALARY) FROM COMPANY;

ফলাফল: 85000.0

MIN:

sql

SELECT MIN(SALARY) FROM COMPANY;

ফলাফল: 10000.0

এগুলো GROUP BY-র সাথেও ব্যবহার করা যায়, যেমন প্রতিটি শহরের সর্বোচ্চ বেতন।


৩. AVG ফাংশন – গড় মান

একটি সংখ্যাবাচক কলামের গড় (average) বের করে। NULL মান উপেক্ষা করে।

sql

SELECT AVG(SALARY) FROM COMPANY;

ফলাফল: প্রায় 37142.857...


৪. SUM ফাংশন – যোগফল

একটি কলামের সমস্ত মানের যোগফল দেয়।

sql

SELECT SUM(SALARY) FROM COMPANY;

ফলাফল: 260000.0


৫. RANDOM ফাংশন – এলোমেলো সংখ্যা

একটি সিউডো-র‍্যান্ডম পূর্ণসংখ্যা ফেরত দেয়, যার সীমা -9223372036854775808 থেকে +9223372036854775807।

sql

SELECT RANDOM() AS RandomNumber;

একটি নির্দিষ্ট সীমার মধ্যে র‍্যান্ডম পেতে:

sql

SELECT ABS(RANDOM()) % 100 + 1 AS Random1to100; -- 1 থেকে 100

৬. ABS ফাংশন – পরম মান

কোনো সংখ্যার ধনাত্মক মান (পরম মান) ফেরত দেয়। স্ট্রিং দিলে 0.0 ফেরত দেয় (যদি সেটি সংখ্যায় রূপান্তরযোগ্য না হয়)।

sql

SELECT ABS(5), ABS(-15), ABS(NULL), ABS(0), ABS("ABC");

ফলাফল: 5 | 15 | NULL | 0 | 0.0


৭. UPPER ও LOWER ফাংশন – বড়/ছোট হাতের অক্ষর

স্ট্রিংকে বড় হাতের (UPPER) বা ছোট হাতের (LOWER) অক্ষরে রূপান্তর করে।

sql

SELECT UPPER(NAME) FROM COMPANY;
SELECT LOWER(NAME) FROM COMPANY;

ফলাফল: PAUL, ALLEN, … এবং paul, allen, …


৮. LENGTH ফাংশন – স্ট্রিং-এর দৈর্ঘ্য

একটি স্ট্রিংয়ে কয়টি অক্ষর আছে তা ফেরত দেয়। ইউনিকোড সমর্থিত, তাই বাংলা বর্ণের জন্যও কাজ করবে।

sql

SELECT NAME, LENGTH(NAME) FROM COMPANY;

ফলাফল:

text

NAME        LENGTH(NAME)
----------  ------------
Paul        4
Allen       5
Teddy       5
Mark        4
David       5
Kim         3
James       5

৯. sqlite_version ফাংশন – SQLite সংস্করণ

বর্তমানে ব্যবহৃত SQLite লাইব্রেরির ভার্সন নাম্বার জানতে।

sql

SELECT sqlite_version() AS 'SQLite Version';

ফলাফল: 3.51.1


১০. ডিরেক্টরি স্ট্রাকচার ও প্যাকেজ

শুধুমাত্র functions_demo.db ফাইলটি ব্যবহৃত হয়েছে। সমস্ত ফাংশন বিল্ট-ইন; কোনো বাড়তি প্যাকেজ লাগবে না।

text

project-folder/
└── functions_demo.db

১১. গুরুত্বপূর্ণ টিপস

  • কেস ইনসেনসিটিভ: আপনি count, COUNT, বা Count যেকোনোভাবে লিখতে পারেন।
  • NULL-এর সাথে আচরণ: COUNT(*) NULL সারিও গণনা করে; COUNT(column) শুধু not-null সারি। AVG, SUM, MAX, MIN ফাংশনগুলো NULL উপেক্ষা করে।
  • পারফরম্যান্স: অ্যাগ্রিগেট ফাংশন বড় টেবিলে ইনডেক্সের সাথে দ্রুত কাজ করে।
  • RANDOM-এর ব্যবহার: টেস্ট ডেটা জেনারেশন বা লটারির জন্য RANDOM কাজে আসে।
  • UPPER/LOWER: এগুলো শুধু ASCII-র জন্য কার্যকর; ইউনিকোড অক্ষরের ক্ষেত্রে SQLite-র আচরণ কোলেশন সেটিংয়ের উপর নির্ভর করে।

১২. সম্পূর্ণ অনুশীলন সেশন

sql

.headers on
.mode column

-- ১. মোট রেকর্ড ও বেতনের গড়
SELECT COUNT(*) AS TotalEmployees, AVG(SALARY) AS AverageSalary FROM COMPANY;

-- ২. সর্বোচ্চ ও সর্বনিম্ন বেতন
SELECT MAX(SALARY) AS Highest, MIN(SALARY) AS Lowest FROM COMPANY;

-- ৩. বড় হাতের নাম
SELECT UPPER(NAME) AS NAME_UPPER FROM COMPANY;

-- ৪. ছোট হাতের নাম ও দৈর্ঘ্য
SELECT LOWER(NAME) AS NAME_LOWER, LENGTH(NAME) AS Length FROM COMPANY;

-- ৫. র‍্যান্ডম সংখ্যা
SELECT RANDOM() AS RandomValue;

-- ৬. পরম মান
SELECT ABS(-123.45) AS Absolute;

-- ৭. SQLite ভার্সন
SELECT sqlite_version();

পরবর্তী পর্বে

আমরা শিখব SQLite EXPLAIN – কিভাবে কোয়েরি প্ল্যান বিশ্লেষণ করে ডিবাগিং ও অপ্টিমাইজেশন করতে হয়।

লেখকের কথা: বিল্ট-ইন ফাংশনগুলো SQLite-তে ডেটা ম্যানিপুলেশনকে সহজ ও দ্রুত করে। বাংলায় প্রযুক্তি শেখার এই সিরিজ আপনার ডাটাবেস দক্ষতা বৃদ্ধির যাত্রায় সঙ্গী হোক। পোস্টটি ভালো লাগলে শেয়ার করুন, এবং সম্পূর্ণ সিরিজের আপডেট পেতে ToLearnTeam.com সাবস্ক্রাইব করুন। কোনো প্রশ্ন থাকলে কমেন্টে জানান – আমরা উত্তর দিতে প্রস্তুত!



SQLite Full Course

  1. SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
  2. SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
  3. SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
  4. SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
  5. SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
  6. SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
  7. SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
  8. SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
  9. SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
  10. SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
  11. SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
  12. SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
  13. SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
  14. SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
  15. SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
  16. SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  17. SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
  18. SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
  19. SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
  20. SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
  21. SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
  22. SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
  23. SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
  24. SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  25. SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
  26. SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
  27. SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
  28. SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
  29. SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
  30. SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
  31. SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
  32. SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
  33. SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
  34. SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
  35. SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
  36. SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
  37. SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
  38. SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
  39. SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
  40. SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
  41. SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
  42. SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
  43. SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
  44. SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
  45. SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
  46. SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
  47. SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
  48. SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
  49. SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
  50. SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)

The post SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল) appeared first on To Learn Team.

]]>
SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল) https://tolearnteam.com/sqlite-date-time-functions-bangla/ Sat, 08 Aug 2026 03:40:45 +0000 http://tolearnteam.com/?p=2237 ডাটাবেসে তারিখ ও সময় সংক্রান্ত ডেটা সংরক্ষণ এবং প্রক্রিয়াকরণ একটি অতি সাধারণ চাহিদা – জন্মতারিখ, লেনদেনের সময়, লগ এন্ট্রি ইত্যাদি। SQLite-তে এর জন্য পাঁচটি শক্তিশালী বিল্ট-ইন ফাংশন আছে: date(), time(), datetime(), julianday(), এবং strftime()। এরা…

The post SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল) appeared first on To Learn Team.

]]>
ডাটাবেসে তারিখ ও সময় সংক্রান্ত ডেটা সংরক্ষণ এবং প্রক্রিয়াকরণ একটি অতি সাধারণ চাহিদা – জন্মতারিখ, লেনদেনের সময়, লগ এন্ট্রি ইত্যাদি। SQLite-তে এর জন্য পাঁচটি শক্তিশালী বিল্ট-ইন ফাংশন আছে: date(), time(), datetime(), julianday(), এবং strftime()। এরা সবাই একটি টাইম স্ট্রিং (time string) এবং প্রয়োজনীয় কিছু মডিফায়ার (modifier) গ্রহণ করে কাঙ্ক্ষিত ফরম্যাটে তারিখ বা সময় ফেরত দেয়। আজকের পর্বে আমরা প্রতিটি ফাংশনের ব্যবহার, টাইম স্ট্রিং-এর ফরম্যাট, মডিফায়ারের জাদু, এবং strftime() দিয়ে কাস্টম ফরম্যাটিং বিস্তারিত উদাহরণসহ শিখব।


পূর্বপ্রস্তুতি

  • SQLite ইন্সটল থাকতে হবে (সিরিজের ৩য় পর্ব দেখুন)।
  • আমরা সরাসরি SQLite শেলে ফাংশনগুলো টেস্ট করব। কোনো টেবিল বা আলাদা ডাটাবেসের প্রয়োজন নেই; :memory: ডাটাবেসেই চলবে।
  • আউটপুট সুন্দর করতে .header on ও .mode column ঐচ্ছিক, কারণ এখানে স্কেলার ভ্যালু ফেরত আসবে।

bash

sqlite3 :memory:

১. পাঁচটি ডেট-টাইম ফাংশনের পরিচিতি

প্রতিটি ফাংশন একটি টাইম স্ট্রিং (যেমন 'now', '2025-08-08', ইত্যাদি) এবং শূন্য বা একাধিক মডিফায়ার নেয়। একমাত্র strftime()-এর প্রথম আর্গুমেন্ট একটি ফরম্যাট স্ট্রিং।

ফাংশনকাজউদাহরণ আউটপুট
date(...)তারিখ (YYYY-MM-DD)2025-08-08
time(...)সময় (HH:MM:SS)14:30:00
datetime(...)তারিখ ও সময় (YYYY-MM-DD HH:MM:SS)2025-08-08 14:30:00
julianday(...)জুলিয়ান ডে নম্বর (৪৭১৪ খ্রিস্টপূর্বাব্দের ২৪ নভেম্বর, গ্রিনিচ দুপুর থেকে দিন সংখ্যা)2460925.104
strftime(format, ...)কাস্টম ফরম্যাট অনুযায়ী তারিখ/সময় স্ট্রিং'08/08/2025'

২. টাইম স্ট্রিং (Time Strings)

টাইম স্ট্রিং হিসেবে আপনি বিভিন্ন ফরম্যাটের মান ব্যবহার করতে পারেন। বহুল ব্যবহৃত ফরম্যাটগুলো হলো:

ফরম্যাটউদাহরণ
YYYY-MM-DD'2025-08-08'
YYYY-MM-DD HH:MM'2025-08-08 14:30'
YYYY-MM-DD HH:MM:SS.SSS'2025-08-08 14:30:05.500'
MM-DD-YYYY HH:MM'08-08-2025 14:30'
HH:MM'14:30'
YYYY-MM-DDTHH:MM'2025-08-08T14:30' (T হলো সেপারেটর)
HH:MM:SS'14:30:05'
YYYYMMDD HHMMSS'20250808 143005'
nowবর্তমান সময়ের জন্য (কোটেশন সহ 'now')

৩. মডিফায়ার (Modifiers)

মডিফায়ারগুলো টাইম স্ট্রিংয়ের পরে যোগ করা হয় এবং সময়ের হিসাব পরিবর্তন করে। এরা বাম থেকে ডানে প্রয়োগ হয়। বহুল ব্যবহৃত মডিফায়ার:

  • NNN days – N দিন যোগ/বিয়োগ
  • NNN hours – N ঘন্টা
  • NNN minutes – N মিনিট
  • NNN.NNNN seconds – N সেকেন্ড
  • NNN months – N মাস
  • NNN years – N বছর
  • start of month – মাসের প্রথম দিন
  • start of year – বছরের প্রথম দিন
  • start of day – দিনের শুরু (00:00:00)
  • weekday N – পরবর্তী N তম দিন (0=রবি, 1=সোম,…)
  • unixepoch – ইউনিক্স টাইমস্ট্যাম্প থেকে কনভার্ট
  • localtime – স্থানীয় সময়ে রূপান্তর
  • utc – UTC-তে রূপান্তর

উদাহরণ:

sql

SELECT date('now', '+1 day');        -- আগামীকাল
SELECT date('now', '-7 days');       -- ৭ দিন আগে
SELECT date('now', 'start of month');-- চলতি মাসের ১ তারিখ
SELECT date('now', '+1 month', '-1 day'); -- চলতি মাসের শেষ দিন

৪. ব্যবহারিক উদাহরণসমূহ

৪.১ বর্তমান তারিখ ও সময়

sql

SELECT date('now');           -- 2025-08-08
SELECT time('now');           -- 14:30:05
SELECT datetime('now');       -- 2025-08-08 14:30:05

৪.২ ইউনিক্স টাইমস্ট্যাম্প থেকে কনভার্ট

sql

SELECT datetime(1092941466, 'unixepoch');        -- 2004-08-19 18:51:06 (UTC)
SELECT datetime(1092941466, 'unixepoch', 'localtime'); -- স্থানীয় সময়

৪.৩ বর্তমান ইউনিক্স টাইমস্ট্যাম্প বের করা

sql

SELECT strftime('%s', 'now');   -- 1393348134 (উদাহরণ)

৪.৪ জুলিয়ান ডে ব্যবহার

sql

SELECT julianday('now');        -- বর্তমান জুলিয়ান ডে
SELECT julianday('now') - julianday('1776-07-04'); -- যুক্তরাষ্ট্রের স্বাধীনতা দিবস থেকে দিনসংখ্যা

৪.৫ ইউটিসি ও স্থানীয় সময়ে রূপান্তর

sql

SELECT time('12:00', 'localtime');  -- আপনার লোকাল টাইম অনুযায়ী
SELECT time('12:00', 'utc');        -- UTC-তে রূপান্তর

৪.৬ নির্দিষ্ট দিন গণনা

চলতি বছরের অক্টোবরের প্রথম মঙ্গলবার (weekday 2 = মঙ্গলবার):

sql

SELECT date('now', 'start of year', '+9 months', 'weekday 2');

৫. strftime() ও ফরম্যাটার (Formatters)

strftime() ফাংশনটি প্রথম আর্গুমেন্ট হিসেবে একটি ফরম্যাট স্ট্রিং নেয় এবং কাস্টম ফরম্যাটে তারিখ/সময় আউটপুট দেয়।

প্রধান ফরম্যাট স্পেসিফায়ার:

স্পেসিফায়ারঅর্থউদাহরণ
%dমাসের দিন (01-31)08
%fসেকেন্ডের ভগ্নাংশ (SS.SSS)05.500
%Hঘন্টা (00-23)14
%jবছরের দিন (001-366)220
%Jজুলিয়ান ডে নম্বর2460925.1
%mমাস (01-12)08
%Mমিনিট (00-59)30
%s১৯৭০-০১-০১ থেকে সেকেন্ড1691483405
%Sসেকেন্ড (00-59)05
%wসপ্তাহের দিন (0=রবি, 6=শনি)5
%Wবছরের সপ্তাহ (01-53)32
%Yবছর (YYYY)2025
%%% চিহ্ন%

উদাহরণ:

sql

SELECT strftime('%d/%m/%Y', 'now');           -- 08/08/2025
SELECT strftime('%Y-%m-%d %H:%M:%S', 'now'); -- 2025-08-08 14:30:05
SELECT strftime('%s', 'now') - strftime('%s', '2004-01-01 02:34:56'); -- সেকেন্ডের পার্থক্য
SELECT strftime('%W', 'now'); -- চলতি সপ্তাহ নম্বর

৬. ডিরেক্টরি স্ট্রাকচার ও প্যাকেজ

এই পর্বে কোনো নির্দিষ্ট ডাটাবেস ফাইলের প্রয়োজন নেই; সমস্ত কোয়েরি ইন-মেমরিতে চালানো যায়। কোনো অতিরিক্ত প্যাকেজ ইন্সটল করতে হবে না। তারিখ ও সময় ফাংশনগুলো SQLite-এর বিল্ট-ইন অংশ।


৭. গুরুত্বপূর্ণ টিপস

  • ডেটা সংরক্ষণের ফরম্যাট: তারিখ ও সময় সাধারণত TEXT (ISO 8601: YYYY-MM-DD HH:MM:SS) হিসেবে সংরক্ষণ করাই উত্তম, কারণ তা মানব-পঠনযোগ্য ও ফাংশনের সাথে সরাসরি কাজ করে।
  • 'now' স্থির: একই কোয়েরিতে 'now' একাধিকবার ব্যবহার করলে সব জায়গায় একই মান পাওয়া যায় (কোয়েরির শুরুতে স্থিরীকৃত), যা ট্রানজ্যাকশন লগের জন্য ভালো।
  • মডিফায়ারের ক্রম গুরুত্বপূর্ণ: date('now', '+1 month', '-1 day') প্রথমে এক মাস বাড়াবে, তারপর এক দিন কমাবে – কাঙ্ক্ষিত মাসের শেষ দিন।
  • unixepoch ব্যবহার: বাইরের সিস্টেম থেকে আসা টাইমস্ট্যাম্পকে datetime(timestamp, 'unixepoch') দিয়ে সহজেই রূপান্তর করুন।
  • জুলিয়ান ডের সুবিধা: দিনের পার্থক্য গণনায় julianday() খুব কার্যকর, কারণ এটি সরাসরি বিয়োগযোগ্য।

৮. সম্পূর্ণ অনুশীলন সেশন

টার্মিনালে নিচের কমান্ডগুলো চালান:

sql

.headers on
.mode column

-- ১. বর্তমান তারিখ, সময়, ও পূর্ণাঙ্গ টাইমস্ট্যাম্প
SELECT date('now') AS আজকের_তারিখ;
SELECT time('now') AS এখন_সময়;
SELECT datetime('now') AS এখন;

-- ২. মাসের শেষ দিন
SELECT date('now', 'start of month', '+1 month', '-1 day') AS মাসের_শেষ_দিন;

-- ৩. ইউনিক্স টাইমস্ট্যাম্প
SELECT strftime('%s', 'now') AS ইউনিক্স_টাইম;

-- ৪. জুলিয়ান ডে পার্থক্য
SELECT julianday('now') - julianday('2000-01-01') AS দিন_সংখ্যা_২০০০_পর;

-- ৫. কাস্টম ফরম্যাট
SELECT strftime('%d/%m/%Y', 'now') AS বাংলাদেশী_তারিখ;
SELECT strftime('%H:%M:%S', 'now', '+6 hours') AS ছয়_ঘন্টা_পর;

-- ৬. স্থানীয় সময় ও UTC
SELECT datetime('now', 'utc') AS UTC_এখন;
SELECT datetime('now', 'localtime') AS স্থানীয়_এখন;

পরবর্তী পর্বে

আমরা শিখব SQLite Useful Functions – স্ট্রিং, ম্যাথ, এবং অন্যান্য বিল্ট-ইন ফাংশন যা দৈনন্দিন ডেটা প্রক্রিয়াকরণে কাজে আসে।

লেখকের কথা: তারিখ ও সময় নিয়ে কাজ করা এখন আপনার জন্য পানির মতো সহজ হবে। বাংলায় SQLite শেখার এই সিরিজ চলমান রাখতে আপনার উৎসাহ আমাদের বড় পাথেয়। পোস্টটি ভালো লাগলে শেয়ার করতে ভুলবেন না, এবং সিরিজের সব আপডেট পেতে ToLearnTeam.com সাবস্ক্রাইব করুন। কোনো প্রশ্ন বা জিজ্ঞাসা কমেন্টে জানান – আমরা উত্তর দিতে প্রস্তুত!



SQLite Full Course

  1. SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
  2. SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
  3. SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
  4. SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
  5. SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
  6. SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
  7. SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
  8. SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
  9. SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
  10. SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
  11. SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
  12. SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
  13. SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
  14. SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
  15. SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
  16. SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  17. SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
  18. SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
  19. SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
  20. SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
  21. SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
  22. SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
  23. SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
  24. SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  25. SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
  26. SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
  27. SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
  28. SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
  29. SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
  30. SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
  31. SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
  32. SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
  33. SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
  34. SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
  35. SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
  36. SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
  37. SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
  38. SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
  39. SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
  40. SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
  41. SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
  42. SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
  43. SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
  44. SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
  45. SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
  46. SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
  47. SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
  48. SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
  49. SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
  50. SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)

The post SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল) appeared first on To Learn Team.

]]>
SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল) https://tolearnteam.com/sqlite-vacuum-bangla/ Sat, 08 Aug 2026 03:36:43 +0000 http://tolearnteam.com/?p=2234 SQLite ডাটাবেস দীর্ঘদিন ব্যবহার করলে অনেক INSERT, UPDATE, DELETE-এর ফলে ফাইলের ভেতর ফাঁকা জায়গা (free pages) জমা হয়। এতে ডাটাবেস ফাইল অপ্রয়োজনীয়ভাবে বড় হয়ে যায় এবং কিছু ক্ষেত্রে পারফরম্যান্সও কমতে…

The post SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল) appeared first on To Learn Team.

]]>
SQLite ডাটাবেস দীর্ঘদিন ব্যবহার করলে অনেক INSERT, UPDATE, DELETE-এর ফলে ফাইলের ভেতর ফাঁকা জায়গা (free pages) জমা হয়। এতে ডাটাবেস ফাইল অপ্রয়োজনীয়ভাবে বড় হয়ে যায় এবং কিছু ক্ষেত্রে পারফরম্যান্সও কমতে পারে। VACUUM কমান্ড এই সমস্যার সমাধান করে। এটি সম্পূর্ণ ডাটাবেসকে একটি অস্থায়ী ফাইলে কপি করে সেখান থেকে আবার মূল ফাইলটিকে সাজিয়ে-গুছিয়ে তৈরি করে, ফলে ফাঁকা জায়গা বাদ পড়ে এবং টেবিল ডেটা ধারাবাহিকভাবে সাজানো থাকে। এছাড়াও SQLite-তে auto_vacuum নামে একটি স্বয়ংক্রিয় ব্যবস্থা আছে যা ডিলিট করা পেজগুলোকে ফাইলের শেষে সরিয়ে ডাটাবেসের আকার ছোট রাখে। আজ আমরা ম্যানুয়াল VACUUM, auto_vacuum PRAGMA এবং এদের পার্থক্য উদাহরণসহ শিখব।


পূর্বপ্রস্তুতি

  • SQLite ইন্সটল থাকতে হবে (সিরিজের ৩য় পর্ব দেখুন)।
  • আমরা vacuum_demo.db নামে একটি ডাটাবেস তৈরি করব, যাতে কিছু বড় ডেটা ইনসার্ট করে পরে ডিলিট করলে ফাঁকা জায়গা বোঝা যায়।

টার্মিনাল:

bash

sqlite3 vacuum_demo.db

sql

-- COMPANY টেবিল
CREATE TABLE COMPANY(
   ID INT PRIMARY KEY NOT NULL,
   NAME TEXT NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR(50),
   SALARY REAL
);

-- প্রচুর ডেটা ইনসার্ট করি (বাস্তবে বড় টেবিল সিমুলেট করতে)
INSERT INTO COMPANY VALUES (1, 'Paul', 32, 'California', 20000.00);
INSERT INTO COMPANY VALUES (2, 'Allen', 25, 'Texas', 15000.00);
INSERT INTO COMPANY VALUES (3, 'Teddy', 23, 'Norway', 20000.00);
INSERT INTO COMPANY VALUES (4, 'Mark', 25, 'Rich-Mond', 65000.00);
INSERT INTO COMPANY VALUES (5, 'David', 27, 'Texas', 85000.00);
INSERT INTO COMPANY VALUES (6, 'Kim', 22, 'South-Hall', 45000.00);
INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00);
-- পুনরাবৃত্তি করে আরও বড় করি (কয়েকবার INSERT)
INSERT INTO COMPANY SELECT * FROM COMPANY; -- 14
INSERT INTO COMPANY SELECT * FROM COMPANY; -- 28
INSERT INTO COMPANY SELECT * FROM COMPANY; -- 56
INSERT INTO COMPANY SELECT * FROM COMPANY; -- 112
INSERT INTO COMPANY SELECT * FROM COMPANY; -- 224
INSERT INTO COMPANY SELECT * FROM COMPANY; -- 448
-- প্রায় 448 রেকর্ড, এখন আকার দেখব
  • আউটপুট ফরম্যাট: .header on, .mode column।

১. ম্যানুয়াল VACUUM কমান্ড

VACUUM কমান্ড ডাটাবেস ফাইলকে সম্পূর্ণভাবে পুনর্গঠন করে। এটি প্রথমে মূল ডাটাবেসের কনটেন্ট একটি টেম্প ফাইলে কপি করে, তারপর সেই কপি থেকে মূল ফাইলটি নতুন করে তৈরি করে, ফলে সব ফ্রি পেজ বাদ পড়ে এবং ডেটা ধারাবাহিকভাবে সংরক্ষিত হয়।

সিনট্যাক্স:

sql

VACUUM;

অথবা কমান্ড লাইন থেকে:

bash

sqlite3 database_name "VACUUM;"

উদাহরণ:
প্রথমে ডাটাবেস ফাইলের বর্তমান আকার দেখতে আমরা .shell বা OS-এর ls -l (লিনাক্স/ম্যাক) বা dir (উইন্ডোজ) ব্যবহার করতে পারি। SQLite শেলে নিচের মত করে দেখা যায়:

sql

-- SQLite শেলে আকার দেখা (বাইটে)
-- লিনাক্স/ম্যাক: .shell ls -l vacuum_demo.db
-- উইন্ডোজ: .shell dir vacuum_demo.db

এখন আমরা প্রায় অর্ধেক রেকর্ড ডিলিট করি:

sql

DELETE FROM COMPANY WHERE ID % 2 = 0; -- জোড় আইডি ডিলিট

ডিলিট করার পর ডাটাবেস ফাইল আকার সাধারণত কমে না; ফ্রি পেজ রয়ে যায়। এখন VACUUM চালাই:

sql

VACUUM;

এরপর ফাইলের আকার পরীক্ষা করলে দেখা যাবে তা অনেকটাই কমে গেছে এবং অপ্রয়োজনীয় স্থান আর নেই।

মনে রাখবেন:

  • VACUUM চলাকালে ডাটাবেসে এক্সক্লুসিভ লক নেয়; অন্য কোনো অপারেশন চলতে পারে না।
  • কোনো সক্রিয় ট্রানজ্যাকশন থাকলে VACUUM ব্যর্থ হবে।
  • ইন-মেমরি ডাটাবেসে VACUUM-এর কোনো প্রভাব নেই (no-op)।
  • VACUUM-এর ফলে ROWID বা INTEGER PRIMARY KEY ছাড়া টেবিলের rowid পরিবর্তিত হতে পারে (সাধারণত টেবিল পুনর্গঠনের জন্য)।
  • VACUUM দিয়ে ডাটাবেসের পেজ সাইজ, এনকোডিং ইত্যাদি কনফিগারেশনও পরিবর্তন করা সম্ভব (তবে তা উন্নত বিষয়)।

২. নির্দিষ্ট টেবিলের VACUUM (SQLite 3.34+)

সাম্প্রতিক SQLite সংস্করণে আপনি নির্দিষ্ট টেবিলের জন্যও VACUUM চালাতে পারেন (যদিও এটি মূলত পুরো ডাটাবেসই পুনর্গঠন করে, শুধু টেবিলের নাম দিয়ে ডাটাবেস ভ্যাকুয়াম করে)।

sql

VACUUM table_name;

তবে এই ফিচারটি 3.34.0 থেকে আসলেও পুরো ডাটাবেসের মতোই কাজ করে; টেবিলের নাম দেওয়া হলে সংশ্লিষ্ট টেবিলের ডেটা ধারাবাহিক হবে।


৩. Auto-VACUUM – স্বয়ংক্রিয় স্থান সংকোচন

auto_vacuum PRAGMA সেট করলে SQLite নিজেই ডিলিট হওয়া পেজগুলোকে ট্র্যাক করে এবং ফাঁকা জায়গাগুলো ডাটাবেস ফাইলের শেষে সরিয়ে নেয়, যাতে সময়ের সাথে ফাইল আকার বাড়তে না পারে। এটি ম্যানুয়াল VACUUM-এর চেয়ে আলাদা: auto_vacuum ফাঁকা পেজগুলোকে শেষে সরায় (ফলে ফাইল ছোট হয়) কিন্তু পুরো ডিফ্র্যাগমেন্টেশন করে না; ম্যানুয়াল VACUUM পুরো ডাটাবেসকে নতুন করে সাজায়।

PRAGMA মান:

  • NONE (0): auto_vacuum বন্ধ (ডিফল্ট)।
  • FULL (1): সম্পূর্ণ auto_vacuum চালু; প্রতিবার ডিলিট হলে ফাঁকা পেজ ফাইলের শেষে চলে যায়।
  • INCREMENTAL (2): auto_vacuum চালু, কিন্তু ফাঁকা পেজগুলি incremental_vacuum PRAGMA দিয়ে ম্যানুয়ালি সরাতে হবে, স্বয়ংক্রিয়ভাবে নয়।

সেটিং:

sql

PRAGMA auto_vacuum = FULL;   -- চালু
PRAGMA auto_vacuum = NONE;   -- বন্ধ
PRAGMA auto_vacuum = INCREMENTAL; -- ইনক্রিমেন্টাল

বর্তমান সেটিং দেখা:

sql

PRAGMA auto_vacuum;

অথবা কমান্ড লাইন থেকে:

bash

sqlite3 database_name "PRAGMA auto_vacuum;"

গুরুত্বপূর্ণ: auto_vacuum সেটিং পরিবর্তন করলে তা নতুন করে VACUUM না চালানো পর্যন্ত কার্যকর হয় না। অর্থাৎ, সেট করার পরপরই VACUUM কমান্ড দিতে হবে যাতে পরিবর্তন স্থায়ী হয়।

কখন কোনটি ব্যবহার করবেন?

  • যদি আপনার ডাটাবেসে ঘন ঘন ডিলিট হয় এবং ফাইলের আকার বেড়ে যাওয়া সমস্যা, তাহলে auto_vacuum = FULL সেট করে দিন এবং একটি প্রাথমিক VACUUM চালান। তবে এতে ইনসার্ট/ডিলিট কিছুটা ধীর হতে পারে।
  • INCREMENTAL বেছে নিলে আপনি নিজে কন্ট্রোল করে PRAGMA incremental_vacuum দিয়ে ধাপে ধাপে স্পেস রিক্লেইম করতে পারেন।
  • যদি ফাইলের আকার নিয়ে বিশেষ চিন্তা না থাকে এবং সর্বোচ্চ পারফরম্যান্স চান, তাহলে auto_vacuum বন্ধ রাখাই ভালো, মাঝে মাঝে ম্যানুয়াল VACUUM করবেন।

৪. ডিরেক্টরি স্ট্রাকচার ও ফাইলের আকার

ডাটাবেস ফাইল: vacuum_demo.db। VACUUM চালানোর সময় একটি অস্থায়ী টেম্প ফাইল তৈরি হতে পারে (যেমন vacuum_demo.db-vacuum), কিন্তু শেষে তা মুছে মূল ফাইল রিপ্লেস করে।

text

project-folder/
└── vacuum_demo.db

কোনো অতিরিক্ত প্যাকেজ ইন্সটল করতে হবে না।


৫. গুরুত্বপূর্ণ টিপস

  • VACUUM চলাকালে ব্যাকআপ: যেহেতু VACUUM পুরো ডাটাবেস পুনর্লিখন করে, এটি বড় ডাটাবেসে সময়সাপেক্ষ। ভুলক্রমে বাধা পেলে ডাটাবেস নষ্ট হতে পারে, তাই আগে .backup নিয়ে নিন।
  • সক্রিয় ট্রানজ্যাকশন এড়ান: VACUUM চালানোর আগে নিশ্চিত হন যে কোনো অসমাপ্ত ট্রানজ্যাকশন নেই; BEGIN করার পর VACUUM করলে এরর আসবে।
  • VACUUM-এর পর ROWID: INTEGER PRIMARY KEY না থাকলে VACUUM-এর ফলে ROWID পরিবর্তন হতে পারে, যা কিছু অ্যাপ্লিকেশনে সমস্যা সৃষ্টি করতে পারে।
  • ফাইল সিস্টেম: VACUUM-এর জন্য পর্যাপ্ত ডিস্ক স্পেস থাকা দরকার, কারণ একটি সম্পূর্ণ কপি তৈরি হয়।
  • পিরিয়ডিক VACUUM: বড় ডাটাবেসের ক্ষেত্রে নিয়মিত রক্ষণাবেক্ষণ হিসেবে VACUUM চালানো ভালো, তবে ব্যস্ত সময়ে নয়।
  • auto_vacuum = INCREMENTAL: এই সেটিং-এ ফাঁকা পেজগুলো PRAGMA incremental_vacuum(N) দিয়ে ধাপে ধাপে ফ্রি করা যায়, যা দীর্ঘমেয়াদী অপারেশনের জন্য সুবিধাজনক।

৬. সম্পূর্ণ অনুশীলন সেশন

sql

.headers on
.mode column

-- বর্তমান auto_vacuum সেটিং দেখি
PRAGMA auto_vacuum;

-- বর্তমান ডাটাবেস সাইজ (OS কমান্ড ব্যবহার করে, নিচে উদাহরণ)
-- .shell ls -l vacuum_demo.db  (লিনাক্স/ম্যাক)
-- .shell dir vacuum_demo.db    (উইন্ডোজ)

-- কিছু ডেটা ডিলিট করে ফ্রি স্পেস তৈরি করি
DELETE FROM COMPANY WHERE ID % 3 = 0;
-- ফাইল সাইজ অপরিবর্তিত থাকতে পারে।

-- ম্যানুয়াল VACUUM
VACUUM;
-- এখন আবার ফাইল সাইজ দেখুন, ছোট হয়েছে।

-- auto_vacuum = FULL সেট করি এবং VACUUM দিয়ে প্রয়োগ করি
PRAGMA auto_vacuum = FULL;
VACUUM;
PRAGMA auto_vacuum;   -- 1 (FULL)

-- কিছু ইনসার্ট ও ডিলিট করি; auto_vacuum কাজ করবে কিনা পর্যবেক্ষণ
INSERT INTO COMPANY VALUES (999, 'Test', 99, 'Nowhere', 0);
DELETE FROM COMPANY WHERE ID = 999;

-- আবার VACUUM ছাড়াই ফাইলের আকার দেখতে পারি (FULL মোডে কিছুটা রক্ষণাবেক্ষণ হবে)
-- আবার auto_vacuum বন্ধ করে দিতে চাইলে:
PRAGMA auto_vacuum = NONE;
VACUUM;

পরবর্তী পর্বে

আমরা শিখব SQLite Useful Functions – DATE, TIME, String, Math ইত্যাদি বিল্ট-ইন ফাংশনের ব্যবহার।

লেখকের কথা: VACUUM আপনার ডাটাবেসকে স্বাস্থ্যবান রাখে। বড় ডাটাবেসে একে নিয়মিত ব্যবহার করা ভালো। বাংলায় SQLite শেখার এই সিরিজের প্রতি আপনার আগ্রহ আমাদের স্পৃহা বাড়ায়। পোস্টটি ভালো লাগলে শেয়ার করুন, এবং সম্পূর্ণ সিরিজের আপডেট পেতে ToLearnTeam.com সাবস্ক্রাইব করুন। কোনো জিজ্ঞাসা থাকলে কমেন্টে জানান – আমরা উত্তর দিতে প্রস্তুত!SQLite সিরিজের চতুশ্চত্বারিংশ পর্ব: VACUUM – ডাটাবেস পরিষ্কার ও সংকোচন

মেটাডেটা

  • শিরোনাম (Title): SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
  • বর্ণনা (Description): SQLite-তে VACUUM কমান্ড দিয়ে কিভাবে ডাটাবেস ফাইল পুনর্গঠন করে অপ্রয়োজনীয় জায়গা খালি করবেন, ম্যানুয়াল VACUUM, auto_vacuum PRAGMA (NONE, FULL, INCREMENTAL) এর সেটিংস, ডিফ্র্যাগমেন্টেশন ও ROWID-এর প্রভাব – উদাহরণসহ বিস্তারিত বাংলা টিউটোরিয়াল।
  • ফোকাস কীওয়ার্ড: SQLite VACUUM auto_vacuum PRAGMA FULL INCREMENTAL NONE Bangla tutorial
  • ট্যাগ: SQLite, VACUUM, বাংলা টিউটোরিয়াল, auto_vacuum, ডাটাবেস অপ্টিমাইজেশন, PRAGMA
  • স্লাগ: sqlite-vacuum-bangla
  • ফিচার ইমেজ কনসেপ্ট প্রম্পট (16:9): একটি নরম গ্রেডিয়েন্ট ব্যাকগ্রাউন্ডের আধুনিক প্রযুক্তি শিক্ষার ব্যানার। বামে SQLite ফেদার লোগো। কেন্দ্রে একটি ভ্যাকুয়াম ক্লিনার আইকন একটি ডাটাবেস সিলিন্ডার পরিষ্কার করছে, সাথে বাংলা শিরোনাম “VACUUM কমান্ড” বোল্ড টাইপোগ্রাফিতে। নিচে VACUUM; এবং PRAGMA auto_vacuum = FULL; কোড স্নিপেট ভাসমান। পেশাদার ও পরিষ্কার ভাব।
  • অল্ট টেক্সট: SQLite VACUUM কমান্ড ও auto_vacuum PRAGMA দিয়ে ডাটাবেস অপ্টিমাইজ করার বাংলা টিউটোরিয়াল

ভূমিকা

SQLite ডাটাবেস দীর্ঘদিন ব্যবহার করলে অনেক INSERT, UPDATE, DELETE-এর ফলে ফাইলের ভেতর ফাঁকা জায়গা (free pages) জমা হয়। এতে ডাটাবেস ফাইল অপ্রয়োজনীয়ভাবে বড় হয়ে যায় এবং কিছু ক্ষেত্রে পারফরম্যান্সও কমতে পারে। VACUUM কমান্ড এই সমস্যার সমাধান করে। এটি সম্পূর্ণ ডাটাবেসকে একটি অস্থায়ী ফাইলে কপি করে সেখান থেকে আবার মূল ফাইলটিকে সাজিয়ে-গুছিয়ে তৈরি করে, ফলে ফাঁকা জায়গা বাদ পড়ে এবং টেবিল ডেটা ধারাবাহিকভাবে সাজানো থাকে। এছাড়াও SQLite-তে auto_vacuum নামে একটি স্বয়ংক্রিয় ব্যবস্থা আছে যা ডিলিট করা পেজগুলোকে ফাইলের শেষে সরিয়ে ডাটাবেসের আকার ছোট রাখে। আজ আমরা ম্যানুয়াল VACUUM, auto_vacuum PRAGMA এবং এদের পার্থক্য উদাহরণসহ শিখব।


পূর্বপ্রস্তুতি

  • SQLite ইন্সটল থাকতে হবে (সিরিজের ৩য় পর্ব দেখুন)।
  • আমরা vacuum_demo.db নামে একটি ডাটাবেস তৈরি করব, যাতে কিছু বড় ডেটা ইনসার্ট করে পরে ডিলিট করলে ফাঁকা জায়গা বোঝা যায়।

টার্মিনাল:

bash

sqlite3 vacuum_demo.db

sql

-- COMPANY টেবিল
CREATE TABLE COMPANY(
   ID INT PRIMARY KEY NOT NULL,
   NAME TEXT NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR(50),
   SALARY REAL
);

-- প্রচুর ডেটা ইনসার্ট করি (বাস্তবে বড় টেবিল সিমুলেট করতে)
INSERT INTO COMPANY VALUES (1, 'Paul', 32, 'California', 20000.00);
INSERT INTO COMPANY VALUES (2, 'Allen', 25, 'Texas', 15000.00);
INSERT INTO COMPANY VALUES (3, 'Teddy', 23, 'Norway', 20000.00);
INSERT INTO COMPANY VALUES (4, 'Mark', 25, 'Rich-Mond', 65000.00);
INSERT INTO COMPANY VALUES (5, 'David', 27, 'Texas', 85000.00);
INSERT INTO COMPANY VALUES (6, 'Kim', 22, 'South-Hall', 45000.00);
INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00);
-- পুনরাবৃত্তি করে আরও বড় করি (কয়েকবার INSERT)
INSERT INTO COMPANY SELECT * FROM COMPANY; -- 14
INSERT INTO COMPANY SELECT * FROM COMPANY; -- 28
INSERT INTO COMPANY SELECT * FROM COMPANY; -- 56
INSERT INTO COMPANY SELECT * FROM COMPANY; -- 112
INSERT INTO COMPANY SELECT * FROM COMPANY; -- 224
INSERT INTO COMPANY SELECT * FROM COMPANY; -- 448
-- প্রায় 448 রেকর্ড, এখন আকার দেখব
  • আউটপুট ফরম্যাট: .header on, .mode column।

১. ম্যানুয়াল VACUUM কমান্ড

VACUUM কমান্ড ডাটাবেস ফাইলকে সম্পূর্ণভাবে পুনর্গঠন করে। এটি প্রথমে মূল ডাটাবেসের কনটেন্ট একটি টেম্প ফাইলে কপি করে, তারপর সেই কপি থেকে মূল ফাইলটি নতুন করে তৈরি করে, ফলে সব ফ্রি পেজ বাদ পড়ে এবং ডেটা ধারাবাহিকভাবে সংরক্ষিত হয়।

সিনট্যাক্স:

sql

VACUUM;

অথবা কমান্ড লাইন থেকে:

bash

sqlite3 database_name "VACUUM;"

উদাহরণ:
প্রথমে ডাটাবেস ফাইলের বর্তমান আকার দেখতে আমরা .shell বা OS-এর ls -l (লিনাক্স/ম্যাক) বা dir (উইন্ডোজ) ব্যবহার করতে পারি। SQLite শেলে নিচের মত করে দেখা যায়:

sql

-- SQLite শেলে আকার দেখা (বাইটে)
-- লিনাক্স/ম্যাক: .shell ls -l vacuum_demo.db
-- উইন্ডোজ: .shell dir vacuum_demo.db

এখন আমরা প্রায় অর্ধেক রেকর্ড ডিলিট করি:

sql

DELETE FROM COMPANY WHERE ID % 2 = 0; -- জোড় আইডি ডিলিট

ডিলিট করার পর ডাটাবেস ফাইল আকার সাধারণত কমে না; ফ্রি পেজ রয়ে যায়। এখন VACUUM চালাই:

sql

VACUUM;

এরপর ফাইলের আকার পরীক্ষা করলে দেখা যাবে তা অনেকটাই কমে গেছে এবং অপ্রয়োজনীয় স্থান আর নেই।

মনে রাখবেন:

  • VACUUM চলাকালে ডাটাবেসে এক্সক্লুসিভ লক নেয়; অন্য কোনো অপারেশন চলতে পারে না।
  • কোনো সক্রিয় ট্রানজ্যাকশন থাকলে VACUUM ব্যর্থ হবে।
  • ইন-মেমরি ডাটাবেসে VACUUM-এর কোনো প্রভাব নেই (no-op)।
  • VACUUM-এর ফলে ROWID বা INTEGER PRIMARY KEY ছাড়া টেবিলের rowid পরিবর্তিত হতে পারে (সাধারণত টেবিল পুনর্গঠনের জন্য)।
  • VACUUM দিয়ে ডাটাবেসের পেজ সাইজ, এনকোডিং ইত্যাদি কনফিগারেশনও পরিবর্তন করা সম্ভব (তবে তা উন্নত বিষয়)।

২. নির্দিষ্ট টেবিলের VACUUM (SQLite 3.34+)

সাম্প্রতিক SQLite সংস্করণে আপনি নির্দিষ্ট টেবিলের জন্যও VACUUM চালাতে পারেন। এটি আসলে পুরো ডাটাবেসকেই পুনর্গঠন করে এবং টেবিলের নাম দিয়ে নির্দিষ্ট করে।

sql

VACUUM table_name;

উদাহরণ:

sql

VACUUM COMPANY;

এতে COMPANY টেবিলের ডেটা ধারাবাহিক হবে এবং পুরো ডাটাবেস সংকুচিত হবে। বাস্তবে এটি পুরো ডাটাবেসের VACUUM-এর সমতুল্য, শুধু টেবিল ফিল্টারিং নয়। তাই VACUUM আর VACUUM table_name-এর মধ্যে তেমন কার্যকরী পার্থক্য নেই, কিন্তু নাম উল্লেখ করলে আপনি উদ্দেশ্য স্পষ্ট করতে পারেন।


৩. Auto-VACUUM – স্বয়ংক্রিয় স্থান সংকোচন

auto_vacuum PRAGMA সেট করলে SQLite নিজেই ডিলিট হওয়া পেজগুলোকে ট্র্যাক করে এবং ফাঁকা জায়গাগুলো ডাটাবেস ফাইলের শেষে সরিয়ে নেয়, যাতে সময়ের সাথে ফাইল আকার বাড়তে না পারে। এটি ম্যানুয়াল VACUUM-এর চেয়ে আলাদা: auto_vacuum ফাঁকা পেজগুলোকে শেষে সরায় (ফলে ফাইল ছোট হয়) কিন্তু পুরো ডিফ্র্যাগমেন্টেশন করে না; ম্যানুয়াল VACUUM পুরো ডাটাবেসকে নতুন করে সাজায়।

PRAGMA মান:

  • NONE (0): auto_vacuum বন্ধ (ডিফল্ট)।
  • FULL (1): সম্পূর্ণ auto_vacuum চালু; প্রতিবার ডিলিট হলে ফাঁকা পেজ ফাইলের শেষে চলে যায়।
  • INCREMENTAL (2): auto_vacuum চালু, কিন্তু ফাঁকা পেজগুলি incremental_vacuum PRAGMA দিয়ে ম্যানুয়ালি সরাতে হবে, স্বয়ংক্রিয়ভাবে নয়।

সেটিং:

sql

PRAGMA auto_vacuum = FULL;   -- চালু
PRAGMA auto_vacuum = NONE;   -- বন্ধ
PRAGMA auto_vacuum = INCREMENTAL; -- ইনক্রিমেন্টাল

বর্তমান সেটিং দেখা:

sql

PRAGMA auto_vacuum;

অথবা কমান্ড লাইন থেকে:

bash

sqlite3 database_name "PRAGMA auto_vacuum;"

গুরুত্বপূর্ণ: auto_vacuum সেটিং পরিবর্তন করলে তা নতুন করে VACUUM না চালানো পর্যন্ত কার্যকর হয় না। অর্থাৎ, সেট করার পরপরই VACUUM কমান্ড দিতে হবে যাতে পরিবর্তন স্থায়ী হয়।

কখন কোনটি ব্যবহার করবেন?

  • যদি আপনার ডাটাবেসে ঘন ঘন ডিলিট হয় এবং ফাইলের আকার বেড়ে যাওয়া সমস্যা, তাহলে auto_vacuum = FULL সেট করে দিন এবং একটি প্রাথমিক VACUUM চালান। তবে এতে ইনসার্ট/ডিলিট কিছুটা ধীর হতে পারে।
  • INCREMENTAL বেছে নিলে আপনি নিজে কন্ট্রোল করে PRAGMA incremental_vacuum দিয়ে ধাপে ধাপে স্পেস রিক্লেইম করতে পারেন।
  • যদি ফাইলের আকার নিয়ে বিশেষ চিন্তা না থাকে এবং সর্বোচ্চ পারফরম্যান্স চান, তাহলে auto_vacuum বন্ধ রাখাই ভালো, মাঝে মাঝে ম্যানুয়াল VACUUM করবেন।

৪. ডিরেক্টরি স্ট্রাকচার ও ফাইলের আকার

ডাটাবেস ফাইল: vacuum_demo.db। VACUUM চালানোর সময় একটি অস্থায়ী টেম্প ফাইল তৈরি হতে পারে (যেমন vacuum_demo.db-vacuum), কিন্তু শেষে তা মুছে মূল ফাইল রিপ্লেস করে।

text

project-folder/
└── vacuum_demo.db

কোনো অতিরিক্ত প্যাকেজ ইন্সটল করতে হবে না।


৫. গুরুত্বপূর্ণ টিপস

  • VACUUM চলাকালে ব্যাকআপ: যেহেতু VACUUM পুরো ডাটাবেস পুনর্লিখন করে, এটি বড় ডাটাবেসে সময়সাপেক্ষ। ভুলক্রমে বাধা পেলে ডাটাবেস নষ্ট হতে পারে, তাই আগে .backup নিয়ে নিন।
  • সক্রিয় ট্রানজ্যাকশন এড়ান: VACUUM চালানোর আগে নিশ্চিত হন যে কোনো অসমাপ্ত ট্রানজ্যাকশন নেই; BEGIN করার পর VACUUM করলে এরর আসবে।
  • VACUUM-এর পর ROWID: INTEGER PRIMARY KEY না থাকলে VACUUM-এর ফলে ROWID পরিবর্তন হতে পারে, যা কিছু অ্যাপ্লিকেশনে সমস্যা সৃষ্টি করতে পারে।
  • ফাইল সিস্টেম: VACUUM-এর জন্য পর্যাপ্ত ডিস্ক স্পেস থাকা দরকার, কারণ একটি সম্পূর্ণ কপি তৈরি হয়।
  • পিরিয়ডিক VACUUM: বড় ডাটাবেসের ক্ষেত্রে নিয়মিত রক্ষণাবেক্ষণ হিসেবে VACUUM চালানো ভালো, তবে ব্যস্ত সময়ে নয়।
  • auto_vacuum = INCREMENTAL: এই সেটিং-এ ফাঁকা পেজগুলো PRAGMA incremental_vacuum(N) দিয়ে ধাপে ধাপে ফ্রি করা যায়, যা দীর্ঘমেয়াদী অপারেশনের জন্য সুবিধাজনক।

৬. সম্পূর্ণ অনুশীলন সেশন

sql

.headers on
.mode column

-- বর্তমান auto_vacuum সেটিং দেখি
PRAGMA auto_vacuum;

-- বর্তমান ডাটাবেস সাইজ (OS কমান্ড ব্যবহার করে, নিচে উদাহরণ)
-- .shell ls -l vacuum_demo.db  (লিনাক্স/ম্যাক)
-- .shell dir vacuum_demo.db    (উইন্ডোজ)

-- কিছু ডেটা ডিলিট করে ফ্রি স্পেস তৈরি করি
DELETE FROM COMPANY WHERE ID % 3 = 0;
-- ফাইল সাইজ অপরিবর্তিত থাকতে পারে।

-- ম্যানুয়াল VACUUM
VACUUM;
-- এখন আবার ফাইল সাইজ দেখুন, ছোট হয়েছে।

-- auto_vacuum = FULL সেট করি এবং VACUUM দিয়ে প্রয়োগ করি
PRAGMA auto_vacuum = FULL;
VACUUM;
PRAGMA auto_vacuum;   -- 1 (FULL)

-- কিছু ইনসার্ট ও ডিলিট করি; auto_vacuum কাজ করবে কিনা পর্যবেক্ষণ
INSERT INTO COMPANY VALUES (999, 'Test', 99, 'Nowhere', 0);
DELETE FROM COMPANY WHERE ID = 999;

-- আবার auto_vacuum বন্ধ করে দিতে চাইলে:
PRAGMA auto_vacuum = NONE;
VACUUM;

পরবর্তী পর্বে

আমরা শিখব SQLite Useful Functions – DATE, TIME, String, Math ইত্যাদি বিল্ট-ইন ফাংশনের ব্যবহার।

লেখকের কথা: VACUUM আপনার ডাটাবেসকে স্বাস্থ্যবান রাখে। বড় ডাটাবেসে একে নিয়মিত ব্যবহার করা ভালো। বাংলায় SQLite শেখার এই সিরিজের প্রতি আপনার আগ্রহ আমাদের স্পৃহা বাড়ায়। পোস্টটি ভালো লাগলে শেয়ার করুন, এবং সম্পূর্ণ সিরিজের আপডেট পেতে ToLearnTeam.com সাবস্ক্রাইব করুন। কোনো জিজ্ঞাসা থাকলে কমেন্টে জানান – আমরা উত্তর দিতে প্রস্তুত!



SQLite Full Course

  1. SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
  2. SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
  3. SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
  4. SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
  5. SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
  6. SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
  7. SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
  8. SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
  9. SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
  10. SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
  11. SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
  12. SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
  13. SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
  14. SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
  15. SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
  16. SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  17. SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
  18. SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
  19. SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
  20. SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
  21. SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
  22. SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
  23. SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
  24. SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  25. SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
  26. SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
  27. SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
  28. SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
  29. SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
  30. SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
  31. SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
  32. SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
  33. SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
  34. SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
  35. SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
  36. SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
  37. SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
  38. SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
  39. SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
  40. SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
  41. SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
  42. SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
  43. SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
  44. SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
  45. SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
  46. SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
  47. SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
  48. SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
  49. SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
  50. SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)

The post SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল) appeared first on To Learn Team.

]]>
SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল) https://tolearnteam.com/sqlite-explain-bangla/ Sat, 08 Aug 2026 03:32:53 +0000 http://tolearnteam.com/?p=2231 একটি জটিল SELECT কোয়েরি ধীরগতির হলে আমরা কিভাবে বুঝব কোথায় সমস্যা? কিংবা আমরা কি জানতে চাই না SQLite আসলে আমাদের দেওয়া SQL কীভাবে পর্দার আড়ালে সম্পাদন করছে? এর উত্তর লুকিয়ে…

The post SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল) appeared first on To Learn Team.

]]>
একটি জটিল SELECT কোয়েরি ধীরগতির হলে আমরা কিভাবে বুঝব কোথায় সমস্যা? কিংবা আমরা কি জানতে চাই না SQLite আসলে আমাদের দেওয়া SQL কীভাবে পর্দার আড়ালে সম্পাদন করছে? এর উত্তর লুকিয়ে আছে EXPLAIN ও EXPLAIN QUERY PLAN কমান্ডের মধ্যে। এগুলো SQLite-র সামনে বসালে ডেটা ফেরত না দিয়ে বরং বলে দেয় ইঞ্জিন কিভাবে কাজটি করতে যাচ্ছে। এই পর্বে আমরা EXPLAIN-এর মাধ্যমে একটি কোয়েরির বিস্তারিত অপকোড (opcode) এবং EXPLAIN QUERY PLAN-এর মাধ্যমে উচ্চস্তরের প্ল্যান দেখব। এটি ডিবাগিং ও পারফরম্যান্স অপ্টিমাইজেশনের অপরিহার্য হাতিয়ার।


পূর্বপ্রস্তুতি

  • SQLite ইন্সটল থাকতে হবে (সিরিজের ৩য় পর্ব দেখুন)।
  • আমরা পরিচিত COMPANY টেবিল ব্যবহার করব। explain_demo.db নামে ডাটাবেস তৈরি করি।

টার্মিনাল:

bash

sqlite3 explain_demo.db

sql

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY NOT NULL,
   NAME TEXT NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR(50),
   SALARY REAL
);

INSERT INTO COMPANY VALUES (1, 'Paul', 32, 'California', 20000.00);
INSERT INTO COMPANY VALUES (2, 'Allen', 25, 'Texas', 15000.00);
INSERT INTO COMPANY VALUES (3, 'Teddy', 23, 'Norway', 20000.00);
INSERT INTO COMPANY VALUES (4, 'Mark', 25, 'Rich-Mond', 65000.00);
INSERT INTO COMPANY VALUES (5, 'David', 27, 'Texas', 85000.00);
INSERT INTO COMPANY VALUES (6, 'Kim', 22, 'South-Hall', 45000.00);
INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00);
  • আউটপুট ফরম্যাট: .header on, .mode column।

১. EXPLAIN কী?

EXPLAIN কীওয়ার্ডটি একটি SQL স্টেটমেন্টের আগে বসে এবং সেই স্টেটমেন্টের জন্য SQLite যে অপকোড (opcode) ধাপগুলি অনুসরণ করবে, তা প্রদর্শন করে। এটি মূলত ভার্চুয়াল মেশিনের ভাষায় অনুবাদ, যা ডেভেলপারদের বুঝতে সাহায্য করে ইঞ্জিন কীভাবে ডেটা খুঁজছে, তুলনা করছে, এবং আউটপুট তৈরি করছে।

সিনট্যাক্স:

sql

EXPLAIN [SQLite Query]

উদাহরণ: আমরা দেখতে চাই SELECT * FROM COMPANY WHERE SALARY >= 20000; কোয়েরিটি কীভাবে সম্পাদিত হবে।

sql

EXPLAIN SELECT * FROM COMPANY WHERE SALARY >= 20000;

আউটপুট (সংক্ষিপ্ত রূপ, বাস্তবে অনেকগুলো সারি):

text

addr        opcode      p1          p2          p3
----------  ----------  ----------  ----------  ----------
0           Goto        0           19
1           Integer     0           0
2           OpenRead    0           8
3           SetNumColu  0           5
4           Rewind      0           17
5           Column      0           4
6           RealAffini  0           0
7           Integer     20000       0
8           Lt          357         16          collseq(BI
9           Rowid       0           0
10          Column      0           1
11          Column      0           2
12          Column      0           3
13          Column      0           4
14          RealAffini  0           0
15          Callback    5           0
16          Next        0           5
17          Close       0           0
18          Halt        0           0
19          Transactio  0           0
20          VerifyCook  0           38
21          Goto        0           1
22          Noop        0           0

এটি দেখে হয়তো একটু জটিল লাগতে পারে, কিন্তু মূল বিষয় হলো: এখানে OpenRead টেবিল খোলে, Rewind প্রথম সারিতে যায়, Column কলাম রিড করে, Integer 20000 বসায়, Lt (Less Than) তুলনা করে, Callback আউটপুট দেয়, Next পরবর্তী সারিতে যায়, ইত্যাদি। বাস্তবে আমরা এই অপকোড সরাসরি বিশ্লেষণ না করে EXPLAIN QUERY PLAN-ই বেশি ব্যবহার করি, কারণ এটি সরল ও অর্থবহ।


২. EXPLAIN QUERY PLAN – সরল পরিকল্পনা

EXPLAIN QUERY PLAN কমান্ডটি আরও উচ্চস্তরের একটি সারাংশ দেখায়: কোন টেবিল ব্যবহৃত হচ্ছে, কোনো ইনডেক্স কাজে লাগছে কিনা, টেবিল স্ক্যান হচ্ছে নাকি ইনডেক্স লুকআপ ইত্যাদি। এটি EXPLAIN-এর চেয়ে অনেক বেশি পঠনযোগ্য।

সিনট্যাক্স:

sql

EXPLAIN QUERY PLAN [SQLite Query]

উদাহরণ: একই কোয়েরি এবার EXPLAIN QUERY PLAN দিয়ে বিশ্লেষণ করি।

sql

EXPLAIN QUERY PLAN SELECT * FROM COMPANY WHERE SALARY >= 20000;

ফলাফল:

text

order       from        detail
----------  ----------  -------------
0           0           TABLE COMPANY

এখানে detail কলাম বলছে TABLE COMPANY – অর্থাৎ এটি সম্পূর্ণ টেবিল স্ক্যান করবে (কোনো ইনডেক্স ব্যবহার হবে না)। পরবর্তীতে আমরা ইনডেক্স যোগ করলে দেখতে পাবো SEARCH TABLE COMPANY USING INDEX salary_index বা অনুরূপ কিছু।

আরেকটি উদাহরণ:
আমরা SALARY-র উপর ইনডেক্স তৈরি করি:

sql

CREATE INDEX salary_idx ON COMPANY (SALARY);

এখন আবার দেখি:

sql

EXPLAIN QUERY PLAN SELECT * FROM COMPANY WHERE SALARY >= 20000;

ফলাফল:

text

order       from        detail
----------  ----------  ----------------------------------
0           0           TABLE COMPANY WITH INDEX salary_idx

এখন দেখাচ্ছে এটি ইনডেক্স ব্যবহার করবে, ফলে কোয়েরি দ্রুততর হবে।


৩. EXPLAIN বনাম EXPLAIN QUERY PLAN

বৈশিষ্ট্যEXPLAINEXPLAIN QUERY PLAN
আউটপুটবিস্তারিত অপকোড তালিকা (নিম্ন-স্তর)সংক্ষিপ্ত পরিকল্পনা (উচ্চ-স্তর)
ব্যবহারকারীউন্নত ডেভেলপার, ডিবাগিংসাধারণ অপ্টিমাইজেশন
পঠনযোগ্যতাকম, জটিলসহজ, অর্থপূর্ণ
স্থিতিশীলতাভার্সনভেদে আউটপুট বদলাতে পারেতুলনামূলক স্থিতিশীল

সাধারণত আমরা কোয়েরি টিউন করতে EXPLAIN QUERY PLAN-ই ব্যবহার করব। EXPLAIN তখনই দরকার যখন SQLite-র অভ্যন্তরীণ ত্রুটি খুঁজতে হবে।


৪. ডিরেক্টরি স্ট্রাকচার ও প্যাকেজ

ডাটাবেস ফাইল: explain_demo.db। কোনো বাড়তি প্যাকেজ লাগবে না। EXPLAIN SQLite-এর বিল্ট-ইন ফিচার।

text

project-folder/
└── explain_demo.db

৫. গুরুত্বপূর্ণ টিপস

  • ইনডেক্স পরীক্ষায় দুর্দান্ত: নতুন ইনডেক্স তৈরির পর EXPLAIN QUERY PLAN দিয়ে যাচাই করুন যে সেটি সত্যিই ব্যবহৃত হচ্ছে কিনা।
  • অ্যাপ্লিকেশনে ব্যবহার নয়: SQLite ডকুমেন্টেশন স্পষ্টভাবে জানায়, EXPLAIN-এর আউটপুট ফরম্যাট সংস্করণভেদে বদলাতে পারে; তাই অ্যাপ্লিকেশন লজিক কখনো এই আউটপুটের উপর নির্ভর করবে না।
  • সাবকোয়েরি ও জয়েন বিশ্লেষণ: জটিল JOIN বা সাবকোয়েরির পারফরম্যান্স বুঝতে EXPLAIN QUERY PLAN অপরিহার্য।
  • .eqp ডট কমান্ড: SQLite শেলে .eqp on দিলে স্বয়ংক্রিয়ভাবে প্রতিটি কোয়েরির পর EXPLAIN QUERY PLAN দেখাবে, যা শেখার জন্য চমৎকার।sql.eqp on SELECT * FROM COMPANY WHERE SALARY > 50000; — আউটপুটের আগে QUERY PLAN দেখাবে .eqp off

৬. সম্পূর্ণ অনুশীলন সেশন

sql

.headers on
.mode column

-- ১. প্রাথমিক EXPLAIN QUERY PLAN (ইনডেক্স ছাড়া)
EXPLAIN QUERY PLAN SELECT * FROM COMPANY WHERE SALARY >= 20000;

-- ২. ইনডেক্স তৈরি
CREATE INDEX salary_idx ON COMPANY (SALARY);

-- ৩. পুনরায় একই কোয়েরির প্ল্যান দেখি (এখন ইনডেক্স ব্যবহৃত হবে)
EXPLAIN QUERY PLAN SELECT * FROM COMPANY WHERE SALARY >= 20000;

-- ৪. বড় EXPLAIN আউটপুট দেখা (অপশনাল, অনেক লাইন আসবে)
EXPLAIN SELECT * FROM COMPANY WHERE SALARY >= 20000;

-- ৫. .eqp চালু করে স্বয়ংক্রিয় প্ল্যান দেখা
.eqp on
SELECT * FROM COMPANY WHERE SALARY > 40000;
.eqp off

-- ৬. আরেকটি উদাহরণ: WHERE ইন সহ
EXPLAIN QUERY PLAN SELECT * FROM COMPANY WHERE AGE IN (25, 27) AND ADDRESS = 'Texas';

-- ৭. ইনডেক্স ড্রপ
DROP INDEX salary_idx;

পরবর্তী পর্বে

আমরা শিখব SQLite VACUUM – কীভাবে ডাটাবেস ফাইল সংকুচিত করে জায়গা খালি করা যায় এবং পারফরম্যান্স বজায় রাখা যায়।

লেখকের কথা: EXPLAIN আপনার কোয়েরির স্বাস্থ্য পরীক্ষার যন্ত্র। সঠিক বিশ্লেষণ করে আপনি আপনার অ্যাপ্লিকেশনকে আরও গতিময় করতে পারবেন। বাংলায় SQLite শেখার এই সিরিজ আপনার মূল্যবান সময়ের সার্থক ব্যবহার হোক। পোস্টটি ভালো লাগলে শেয়ার করুন, এবং সম্পূর্ণ সিরিজের আপডেট পেতে ToLearnTeam.com সাবস্ক্রাইব করুন। আপনার প্রশ্ন বা মতামত জানাতে কমেন্ট করুন – আমরা উত্তর দিতে মুখিয়ে আছি!



SQLite Full Course

  1. SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
  2. SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
  3. SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
  4. SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
  5. SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
  6. SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
  7. SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
  8. SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
  9. SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
  10. SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
  11. SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
  12. SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
  13. SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
  14. SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
  15. SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
  16. SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  17. SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
  18. SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
  19. SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
  20. SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
  21. SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
  22. SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
  23. SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
  24. SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  25. SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
  26. SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
  27. SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
  28. SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
  29. SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
  30. SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
  31. SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
  32. SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
  33. SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
  34. SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
  35. SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
  36. SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
  37. SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
  38. SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
  39. SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
  40. SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
  41. SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
  42. SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
  43. SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
  44. SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
  45. SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
  46. SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
  47. SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
  48. SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
  49. SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
  50. SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)

The post SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল) appeared first on To Learn Team.

]]>
SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল) https://tolearnteam.com/sqlite-injection-bangla/ Sat, 08 Aug 2026 03:29:55 +0000 http://tolearnteam.com/?p=2228 ওয়েবসাইট বা অ্যাপ্লিকেশনে ব্যবহারকারী যখন কোনো তথ্য ইনপুট দেয়, তখন সেই ইনপুট সরাসরি SQL কোয়েরিতে জুড়ে দিলে বড় ধরনের নিরাপত্তা ত্রুটি তৈরি হতে পারে – একে বলে SQL Injection। একজন আক্রমণকারী…

The post SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল) appeared first on To Learn Team.

]]>
ওয়েবসাইট বা অ্যাপ্লিকেশনে ব্যবহারকারী যখন কোনো তথ্য ইনপুট দেয়, তখন সেই ইনপুট সরাসরি SQL কোয়েরিতে জুড়ে দিলে বড় ধরনের নিরাপত্তা ত্রুটি তৈরি হতে পারে – একে বলে SQL Injection। একজন আক্রমণকারী সাধারণ ইনপুটের বদলে ক্ষতিকর SQL কোড পাঠিয়ে আপনার পুরো ডাটাবেস নিয়ন্ত্রণ নিতে পারে, ডেটা চুরি বা মুছেও ফেলতে পারে। SQLite-ও এই আক্রমণ থেকে মুক্ত নয়, বরং এটি স্ট্যাকড কোয়েরি (একসাথে একাধিক SQL স্টেটমেন্ট) সমর্থন করে বলে আক্রমণ আরও ভয়াবহ হতে পারে। এই পর্বে আমরা SQL Injection-এর ভয়াবহতা, কীভাবে এটি কাজ করে এবং নিরাপদে কোডিং করার কৌশল (প্যারামিটারাইজড কোয়েরি, এস্কেপিং, ভ্যালিডেশন) বিস্তারিত শিখব।

পূর্বপ্রস্তুতি:

  • SQLite ইন্সটল থাকতে হবে (সিরিজের ৩য় পর্ব দেখুন)।
  • সাধারণ প্রোগ্রামিং ধারণা (পিএইচপি বা পাইথন উদাহরণ বোঝার জন্য)।
  • কোনো বিশেষ প্যাকেজ ইন্সটলের দরকার নেই – আমরা SQLite কমান্ড লাইন ও পাইথনের বিল্ট-ইন sqlite3 মডিউল ব্যবহার করব।

১. SQL Injection কী?

SQL Injection তখন ঘটে যখন ইউজার ইনপুট সঠিকভাবে ফিল্টার বা এস্কেপ না করেই ডাটাবেস কোয়েরির অংশ বানানো হয়। আক্রমণকারী এমন ইনপুট দেয় যা কোয়েরির যুক্তি বদলে দেয় বা সম্পূর্ণ নতুন SQL কমান্ড চালায়।

সরল দৃশ্যপট: ধরুন, একটি লগইন ফর্মে ইউজারনেম নেওয়া হয়:

sql

SELECT * FROM users WHERE username = 'ইউজার_ইনপুট';

ইউজার যদি ' OR '1'='1 টাইপ করে, তাহলে কোয়েরি দাঁড়ায়:

sql

SELECT * FROM users WHERE username = '' OR '1'='1';

এটি সব ইউজার ফেরত দেবে, লগইন বাইপাস হয়ে যাবে।

আরও ভয়ংকর: ইউজার যদি '; DROP TABLE users; -- দেয়, তাহলে SQLite-তে (যা মাল্টিপল স্টেটমেন্ট সাপোর্ট করে) কোয়েরি হবে:

sql

SELECT * FROM users WHERE username = ''; DROP TABLE users; --';

এটি ইউজার টেবিল মুছে ফেলবে।


২. উদাহরণ: দুর্বল পিএইচপি কোড ও আক্রমণ

নিচের পিএইচপি কোডটি দেখুন:

php

$name = $_GET['username'];
$db = new SQLiteDatabase('users.db');
$result = $db->query("SELECT * FROM users WHERE username = '$name'");

এখন যদি $name এর মান Qadir'; DELETE FROM users; -- হয়, তাহলে এক্সিকিউট হবে:

sql

SELECT * FROM users WHERE username = 'Qadir'; DELETE FROM users; --'

SQLite স্ট্যাকড কোয়েরি সমর্থন করে, তাই এটি DELETE FROM users চালিয়ে সব ইউজার ডিলিট করবে।

সতর্কতা: SQLite-তে মাল্টিপল স্টেটমেন্ট একসাথে চালানো যায় (যেমন sqlite3_exec() ফাংশন), তাই ইনজেকশন বড় বিপদ।


৩. প্রতিরোধের উপায়

৩.১ ইনপুট ভ্যালিডেশন

প্রথম প্রতিরক্ষা হলো ব্যবহারকারীর ইনপুট যাচাই করা। যেমন, ইউজারনেম শুধুমাত্র অক্ষর, সংখ্যা ও আন্ডারস্কোর এবং নির্দিষ্ট দৈর্ঘ্যের হতে পারে:

php

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)){
   // নিরাপদ
} else {
   echo "username not accepted";
}

কিন্তু একা ভ্যালিডেশন যথেষ্ট নয়, কারণ অনেক সময় জটিল ইনপুট দরকার হয় (যেমন অ্যাপোস্ট্রফি)।

৩.২ প্যারামিটারাইজড কোয়েরি (Prepared Statements)

সবচেয়ে নিরাপদ পদ্ধতি হলো প্যারামিটারাইজড কোয়েরি বা Prepared Statement ব্যবহার করা। এতে ইউজার ডেটা কখনো সরাসরি SQL স্ট্রিংয়ে যোগ হয় না; বরং প্লেসহোল্ডার (? বা নামযুক্ত) ব্যবহার করে পরে বাইন্ড করা হয়। SQLite একে সম্পূর্ণরূপে সমর্থন করে।

পাইথন উদাহরণ (সঠিক):

python

import sqlite3
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
username = input("Enter username: ")
cursor.execute("SELECT * FROM users WHERE username = ?", (username,))

এখন কেউ ইনজেকশন কোড দিলেও তা শুধু ডেটা হিসেবে গণ্য হবে, কোড হিসেবে নয়।

পিএইচপি-তে PDO প্রস্তুত বিবৃতি:

php

$stmt = $db->prepare("SELECT * FROM users WHERE username = :username");
$stmt->bindValue(':username', $name, SQLITE3_TEXT);
$result = $stmt->execute();

৩.৩ এস্কেপিং (কম পছন্দনীয়)

কিছু পুরনো API আছে যা এস্কেপিং ফাংশন দেয়, যেমন sqlite_escape_string()। এটি বিশেষ ক্যারেক্টার (যেমন কোটেশন) এস্কেপ করে, কিন্তু এটিকে পুরোপুরি নির্ভরযোগ্য বলা যায় না, এবং LIKE ক্লজের সাথে সমস্যা করতে পারে। Prepared Statement-ই আধুনিক ও নিরাপদ পন্থা।

php

$name = sqlite_escape_string($name);
$result = $db->query("SELECT * FROM users WHERE username = '$name'");

addslashes() কখনো SQLite-র জন্য ব্যবহার করবেন না; এটি অদ্ভুত ফল দিতে পারে।


৪. SQLite CLI-তে স্ট্যাকড কোয়েরির উদাহরণ

আমরা নিজেরা পরীক্ষা করে দেখতে পারি যে SQLite মাল্টিপল স্টেটমেন্ট একত্রে চালায়:

bash

sqlite3 :memory:

sql

CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);
INSERT INTO users VALUES (1, 'Rahim');

-- একসাথে একাধিক স্টেটমেন্ট (স্ট্যাকড)
SELECT * FROM users; DELETE FROM users; SELECT 'injected';

এটি SELECT দেখানোর পর DELETE চালাবে এবং শেষে injected স্ট্রিং দেখাবে। এটিই প্রমাণ করে যে, যদি ইউজার ইনপুট এমন কিছু দেয়, তাহলে অনাকাঙ্ক্ষিত কমান্ড চলতে পারে।


৫. ডিরেক্টরি স্ট্রাকচার ও প্যাকেজ

এই পর্বে কোনো নির্দিষ্ট প্রজেক্ট স্ট্রাকচার নেই; আপনার অ্যাপ্লিকেশনের ফাইলের মধ্যে ডাটাবেস ফাইল থাকবে। নিরাপত্তার জন্য ডাটাবেস ফাইলকে ওয়েব-অ্যাক্সেসিবল ডিরেক্টরির বাইরে রাখা বাঞ্ছনীয়।

পাইথনের ক্ষেত্রে কোনো বাড়তি প্যাকেজ লাগবে না; পিএইচপি-তে SQLite3 এক্সটেনশন সচল থাকতে হবে।


৬. গুরুত্বপূর্ণ টিপস

  • কখনোই ইউজার ইনপুট সরাসরি SQL-এ জুড়বেন না – এটি চূড়ান্ত নিয়ম।
  • Prepared Statement ব্যবহার করুন – এটি SQL Injection সম্পূর্ণরূপে রোধ করে।
  • ন্যূনতম সুবিধা নীতি: ডাটাবেস ইউজারকে কেবল প্রয়োজনীয় অনুমতি দিন (তবে SQLite ফাইলভিত্তিক, তাই ফাইল পারমিশন সঠিক রাখুন)।
  • ORM ব্যবহার করলে (যেমন SQLAlchemy) আপনা-আপনি Prepared Statement হয়, তবে কাঁচা SQL লিখলে সতর্ক থাকুন।
  • ত্রুটি বার্তা ব্যবহারকারীকে দেখাবেন না – এতে ডাটাবেস গঠন ফাঁস হতে পারে।
  • নিয়মিত কোড রিভিউ ও টেস্টিং করুন।

৭. সম্পূর্ণ অনুশীলন সেশন (পাইথন নিরাপদ উদাহরণ)

ধরি, আমাদের একটি app.py আছে:

python

import sqlite3

def get_user(username):
    conn = sqlite3.connect('users.db')
    cursor = conn.cursor()
    # নিরাপদ: প্যারামিটারাইজড কোয়েরি
    cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
    return cursor.fetchone()

# ব্যবহার
user_input = input("Username: ")
print(get_user(user_input))

এমনকি যদি ইনপুট '; DROP TABLE users; -- হয়, কিছুই হবে না – এটি শুধু ওই অদ্ভুত ইউজারনেম খুঁজবে।


পরবর্তী পর্বে

আমরা শিখব SQLite EXPLAIN – কীভাবে কোয়েরি প্ল্যান বিশ্লেষণ করে পারফরম্যান্স অপ্টিমাইজ করা যায়।

লেখকের কথা: সিকিউরিটি কোনো ফিচার নয়, অভ্যাস। আজই আপনার কোডে Prepared Statement চালু করুন। বাংলায় SQLite শেখার এই সিরিজ আপনার ডাটাবেস জ্ঞানকে শক্ত ভিতের ওপর দাঁড় করাবে। পোস্টটি ভালো লাগলে শেয়ার করুন, এবং সব আপডেট পেতে ToLearnTeam.com সাবস্ক্রাইব করুন। কোনো প্রশ্ন বা মতামত জানাতে কমেন্ট করুন – আমরা উত্তর দিতে প্রস্তুত!



SQLite Full Course

  1. SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
  2. SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
  3. SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
  4. SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
  5. SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
  6. SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
  7. SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
  8. SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
  9. SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
  10. SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
  11. SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
  12. SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
  13. SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
  14. SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
  15. SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
  16. SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  17. SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
  18. SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
  19. SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
  20. SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
  21. SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
  22. SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
  23. SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
  24. SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  25. SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
  26. SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
  27. SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
  28. SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
  29. SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
  30. SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
  31. SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
  32. SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
  33. SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
  34. SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
  35. SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
  36. SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
  37. SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
  38. SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
  39. SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
  40. SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
  41. SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
  42. SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
  43. SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
  44. SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
  45. SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
  46. SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
  47. SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
  48. SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
  49. SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
  50. SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)

The post SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল) appeared first on To Learn Team.

]]>