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:
database/sqluchun drayver sifatida. Kod standart interfeysda yoziladi.- 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:
- SQL injection — foydalanuvchi kiritgan matn SQL buyrug‘ining bir qismiga aylanib qolishi. Eng eski va hanuzgacha eng keng tarqalgan zaifliklardan biri.
- Parollarni xeshlash — baza o‘g‘irlansa ham, foydalanuvchilarning parollari ochilib qolmasligi kerak.
- Sozlamalar va maxfiy ma’lumotlar — baza paroli kodda yoki Git tarixida qolib ketmasligi kerak.
- 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+pgxdrayveri yoki to‘g‘ridan-to‘g‘ripgxpoolorqali ishlanadi.
Keyingi darsda PostgreSQL’ni ishga tushirib, Go dasturini unga ulaymiz.