Tarkibga o'tish

Ma’lumotlar bazasi va xavfsiz so‘rovlar

CRUD loyihasida kitoblar map ichida saqlangan edi. Bu o‘rganish uchun qulay, lekin jiddiy kamchiligi bor: server qayta ishga tushsa, barcha ma’lumot yo‘qoladi. Bundan tashqari, ikkita server nusxasi bir-birining map’ini ko‘rmaydi. Million yozuv ichidan kerakligini tez topish ham qiyin.

Bu muammolarni ma’lumotlar bazasi (database) hal qiladi. Ma’lumotlar bazasi — ma’lumotni diskda ishonchli saqlaydigan, tez qidirish imkonini beradigan va bir vaqtda ko‘p foydalanuvchiga xizmat qiladigan alohida dastur.

Bu bo‘limda Go API’ni PostgreSQL bilan bog‘laymiz. Shu bilan birga ma’lumot bilan ishlashdagi eng muhim xavfsizlik masalalarini ham ko‘rib chiqamiz: SQL injection, parollarni saqlash va maxfiy sozlamalarni boshqarish.

Nima uchun map yetarli emas?

Talab Map Ma’lumotlar bazasi
Server o‘chsa ham saqlanib qolish ❌ ✅ diskda saqlanadi
Bir nechta server nusxasi bilan ishlash ❌ ✅ hammasi bitta bazaga ulanadi
Katta hajmda tez qidirish ❌ ✅ indekslar orqali
Bir nechta amalni "yo hammasi, yo hech biri" tarzida bajarish ❌ ✅ tranzaksiyalar
Ma’lumot yaxlitligi: noyoblik, bog‘liqliklar Qo‘lda yoziladi ✅ cheklovlar (constraints)

Relatsion ma’lumotlar bazasi

Relatsion ma’lumotlar bazasi ma’lumotni jadvallarda saqlaydi. Jadval Excel varag‘iga o‘xshaydi: ustunlar maydonlarni, qatorlar esa yozuvlarni bildiradi.

books jadvali
┌────┬──────────────────┬──────────────────┬──────┐
│ id │ title            │ author           │ year │
├────┼──────────────────┼──────────────────┼──────┤
│  1 │ O‘tkan kunlar    │ Abdulla Qodiriy  │ 1926 │
│  2 │ Kecha va kunduz  │ Cho‘lpon         │ 1936 │
│  3 │ Sarob            │ Abdulla Qahhor   │ 1937 │
└────┴──────────────────┴──────────────────┴──────┘

Jadvallar bir-biri bilan bog‘lanishi mumkin. Masalan, reviews jadvalidagi har bir sharh book_id ustuni orqali books jadvalidagi kitobga ishora qiladi. "Relatsion" so‘zi aynan shu bog‘liqliklarni (relation) bildiradi.

Keng tarqalgan relatsion bazalar: PostgreSQL, MySQL, SQLite, Microsoft SQL Server. Bu kursda PostgreSQL ishlatiladi. U bepul, ochiq kodli, ishonchli va Go ekotizimida yaxshi qo‘llab-quvvatlanadi.

SQL — baza bilan gaplashish tili

Relatsion bazaga buyruqlar SQL (Structured Query Language) tilida beriladi. CRUD amallari SQL’da shunday yoziladi:

-- Jadval yaratish
CREATE TABLE books (
    id         BIGSERIAL PRIMARY KEY,
    title      TEXT        NOT NULL,
    author     TEXT        NOT NULL,
    year       INT         NOT NULL CHECK (year > 0),
    created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
    UNIQUE (title, author)
);

-- Create: yangi yozuv qo‘shish
INSERT INTO books (title, author, year)
VALUES ('Sarob', 'Abdulla Qahhor', 1937);

-- Read: o‘qish
SELECT id, title, author, year FROM books WHERE author = 'Abdulla Qodiriy';

-- Update: yangilash
UPDATE books SET year = 1925 WHERE id = 1;

-- Delete: o‘chirish
DELETE FROM books WHERE id = 3;

Jadval ta’rifidagi qatorlarning ma’nosi:

  • BIGSERIAL PRIMARY KEY — avtomatik o‘sib boradigan noyob identifikator.
  • NOT NULL — maydon bo‘sh bo‘lishi mumkin emas.
  • CHECK (year > 0) — qiymatga qo‘yilgan shart.
  • DEFAULT now() — qiymat berilmasa, joriy vaqt yoziladi.
  • UNIQUE (title, author) — bitta muallifning bir xil nomli ikkita kitobi bo‘lishi mumkin emas.

E’tibor bering, bu cheklovlar baza darajasida ishlaydi. Go kodida xato bo‘lsa ham, baza noto‘g‘ri ma’lumotni qabul qilmaydi. Bu ma’lumot yaxlitligining oxirgi himoya chizig‘i.

Go’da PostgreSQL bilan ishlash usullari

Go’da SQL bazasi bilan ishlashning bir necha yondashuvi bor:

Yondashuv Vosita Xususiyati
Standart interfeys database/sql + drayver Standart kutubxona, istalgan SQL bazasi bilan ishlaydi
PostgreSQL’ga xos drayver github.com/jackc/pgx/v5 Tezroq, PostgreSQL imkoniyatlarini to‘liq ochadi
SQL’dan kod generatsiya sqlc SQL yozasiz, u tipli Go funksiyalarini yaratadi
ORM GORM, ent SQL o‘rniga Go metodlari bilan ishlanadi

Bu kursda SQL so‘rovlarini qo‘lda yozamiz. Sababi oddiy: SQL’ni tushunmasdan turib har qanday vositadan to‘g‘ri foydalanish qiyin. ORM ham oxir-oqibat SQL yaratadi. Muammo yuz berganda esa aynan shu SQL’ni o‘qib tushunish kerak bo‘ladi.

database/sql — Go standart kutubxonasidagi umumiy interfeys. U ulanishlar pulini (connection pool) boshqaradi, lekin muayyan bazaning protokolini bilmaydi. Buning uchun drayver kerak. PostgreSQL uchun eng keng qo‘llaniladigan drayver — pgx.

pgx ikki xil rejimda ishlatiladi:

  1. database/sql uchun drayver sifatida. Kod standart interfeysda yoziladi.
  2. Mustaqil kutubxona sifatida (pgxpool). Bu rejimda PostgreSQL’ning barcha imkoniyatlari ochiladi va ishlash tezligi biroz yuqori bo‘ladi.

Keyingi darsda ikkala usul ham ko‘rsatiladi.

Xavfsizlik: nimaga e’tibor beramiz?

Ma’lumotlar bazasi — ilovaning eng qimmatli qismi. Undagi ma’lumotlarning sizib chiqishi yoki buzilishi eng og‘ir oqibatlarga olib keladi. Shuning uchun bu bo‘limda to‘rtta xavfsizlik mavzusi alohida ko‘rib chiqiladi:

  1. SQL injection — foydalanuvchi kiritgan matn SQL buyrug‘ining bir qismiga aylanib qolishi. Eng eski va hanuzgacha eng keng tarqalgan zaifliklardan biri.
  2. Parollarni xeshlash — baza o‘g‘irlansa ham, foydalanuvchilarning parollari ochilib qolmasligi kerak.
  3. Sozlamalar va maxfiy ma’lumotlar — baza paroli kodda yoki Git tarixida qolib ketmasligi kerak.
  4. Context va timeout — sekin so‘rov butun serverni to‘xtatib qo‘ymasligi kerak.

Bo‘lim rejasi

Dars Mavzu
PostgreSQL bilan bog‘lanish Docker’da PostgreSQL ishga tushirish, database/sql va pgxpool, CRUD so‘rovlari
Context bilan ishlash So‘rovlarni bekor qilish, timeout, tranzaksiyalar
SQL Injection oldini olish Hujum qanday ishlaydi va parametrli so‘rovlar
Parollarni xeshlash bcrypt bilan parolni xavfsiz saqlash
Config va .env Sozlamalarni koddan ajratish

Bo‘lim oxirida clean architecture darsidagi xotiradagi repository PostgreSQL repository bilan almashtiriladi. Service va handler kodi esa o‘zgarishsiz qoladi.

Xulosa

  • Ma’lumotlar bazasi ma’lumotni ishonchli saqlaydi, tez qidiradi va bir nechta server nusxasiga umumiy manba bo‘ladi.
  • Relatsion baza ma’lumotni jadvallarda saqlaydi. Unga SQL tilida murojaat qilinadi.
  • Baza darajasidagi cheklovlar (NOT NULL, UNIQUE, CHECK) noto‘g‘ri ma’lumotdan himoya qiladi.
  • Go’da PostgreSQL bilan database/sql + pgx drayveri yoki to‘g‘ridan-to‘g‘ri pgxpool orqali ishlanadi.

Keyingi darsda PostgreSQL’ni ishga tushirib, Go dasturini unga ulaymiz.