Ачааллж байна...
Өмнөх хичээлд бид яагаад өгөгдлийн сан хэрэгтэйг ойлгосон. Одоо юуг сурна.
Энэ хичээл нь SQLite-д зориулагдана. Тэр бол бидний энэ сургалтад ашиглах өгөгдлийн сан бөгөөд түүнд нэг гайхалтай онцлог бий: суулгах шаардлагагүй. Тэр аль хэдийн таны Python дотор байгаа.
Бид SQLite гэж юу болох, ердийн өгөгдлийн сангаас юугаараа ялгаатай, .db файл гэж юу болохыг ойлгоно. Мөн эхний удаа өгөгдлийн сантай гар дээрээ танилцана — жижиг Python скрипт бичиж, өгөгдлийн сан үүсгэж, түүнийг файлын жагсаалт дээр өөрийн нүдээр харна.
SQLite-ыг ойлгохын тулд эхлээд ердийн өгөгдлийн сан хэрхэн ажилладгийг мэдэх хэрэгтэй, учир нь SQLite нь тэднээс өөр.
PostgreSQL, MySQL зэрэг ердийн өгөгдлийн сан нь сервер юм. Тэдгээр нь:
Тусад нь суулгагддаг программ.
Байнга ажиллаж байдаг (арын процесс).
Сүлжээгээр холбогддог — хаяг, порт, хэрэглэгчийн нэр, нууц үгтэй.
Тохируулга шаарддаг.
Өөрөөр хэлбэл: таны API нь нэг программ, өгөгдлийн сан нь өөр программ, хоёул сүлжээгээр ярьдаг. Курс 2-ын Бүлэг 11-ийн client/server загвар — гэхдээ энэ удаад таны API нь client, өгөгдлийн сан нь server.
Энэ бүтэц нь том системд зөв. Олон программ нэг өгөгдлийн санд хандаж чадна. Өгөгдлийн санг өөр компьютер дээр байрлуулж болно. Хэдэн зуун холболт зэрэг ажиллана.
Гэхдээ суралцахад энэ нь ачаа юм. Та эхлээд PostgreSQL суулгаж, ажиллуулж, хэрэглэгч үүсгэж, нууц үг тохируулж, холболтын хаяг тохируулах ёстой. Тэр бүхэн нь өгөгдлийн сангийн ойлголтод ямар ч холбоогүй ажил.
SQLite өөр замыг сонгосон. Тэр нь сервер биш — тэр бол сан (library).
Өөрөөр хэлбэл: SQLite нь тусдаа программ биш, харин таны программын дотор ажилладаг код юм. Сүлжээ байхгүй, порт байхгүй, нууц үг байхгүй, арын процесс байхгүй.
Таны бүх өгөгдөл нэг файлд хадгалагдана. Ердийн файл, ердийн хавтаст, notes.db гэх мэт нэртэй.
Тэгэхээр SQLite нь өмнөх хичээлд шүүмжилсэн "файл" уу? Үгүй — энэ бол чухал ялгаа.
Ердийн JSON файл бол зүгээр л текст; түүнийг уншиж, задалж, бичих ажлыг та хийдэг. SQLite файл нь тусгай бүтэцтэй бөгөөд түүнтэй ажиллах бүх ухаалаг логик — index, transaction, зэрэг хандалтын зохицуулалт — SQLite санд бэлэн байдаг.
Өөрөөр хэлбэл: SQLite бол файлын энгийн байдал, өгөгдлийн сангийн ухаалаг байдлын хослол.
Өмнөх хичээлийн агуулахын зүйрлэлээ үргэлжлүүлье.
PostgreSQL бол том агуулах. Өөрийн байртай, өөрийн ажилтантай, хаалганы харуултай. Түүнд хандахын тулд утасдаж, зөвшөөрөл авч, тээвэр зохион байгуулах ёстой. Хэдэн зуун компани нэг агуулах ашиглаж чадна.
SQLite бол таны ширээн доорх хайрцаг. Түүнд хандахад утасдах шаардлагагүй — гараа сунгаад л болно. Хайрцаг нь дотроо цэгцтэй, тасалгаатай, бүртгэлтэй — зүгээр нэг овоо биш. Гэхдээ хайрцаг тул нэг хүн (эсвэл нэг программ) хамгийн сайн ашигладаг.
Хайрцаг бол агуулахаас дутуу зүйл биш; тэр бол өөр хэмжээний зүйл. Хэрэв танд хайрцаг хангалттай бол агуулах барих нь утгагүй.
Дөрвөн шалтгаан бий.
Нэгд, суулгах шаардлагагүй. SQLite нь Python-ы стандарт сангийн нэг хэсэг (sqlite3 модуль). Та Python суулгасан бол SQLite аль хэдийн байгаа. Одоо туршиж болно:
python -c "import sqlite3; print(sqlite3.sqlite_version)"Гаралт (ойролцоогоор):
3.45.1Хувилбарын дугаар гарлаа — SQLite ажиллаж байна. Та юу ч суулгаагүй.
Хоёрт, тохируулга байхгүй. Хаяг, порт, хэрэглэгчийн нэр, нууц үг — юу ч байхгүй. Зөвхөн файлын нэр.
Гуравт, харагдана. Таны бүх өгөгдөл нэг файлд байгаа тул та түүнийг файлын жагсаалт дээр харна. Хуулж болно, зөөж болно, устгаж болно, backup хийж болно. Өгөгдлийн сан нь хийсвэр зүйл биш, харин та харж чадах файл.
Дөрөвт, ойлголт нь ижил. SQLite-д сурсан бүх зүйл — хүснэгт, мөр, SQL, transaction, index — PostgreSQL-д яг адилхан ажиллана. Та жижиг систем дээр сурч, дараа нь том систем рүү мэдлэгээ бүхэлд нь авч явна.
Энд нэг эндүүрлийг арилгах хэрэгтэй. "Суулгах шаардлагагүй, файлд суудаг" гэдгээс "жинхэнэ өгөгдлийн сан биш, зөвхөн сургалтад зориулагдсан" гэсэн дүгнэлт гарч болно.
Тэр нь буруу. SQLite бол дэлхийн хамгийн өргөн ашиглагддаг өгөгдлийн сан юм — бүх өгөгдлийн сангаас илүү олон газар суулгагдсан.
Хаана вэ? Таны утсан дотор. Android болон iOS хоёулаа SQLite ашигладаг — таны мессеж, харилцагчийн жагсаалт, апп бүрийн тохиргоо ихэвчлэн SQLite файлд хадгалагддаг. Browser-ууд ашигладаг. Олон ширээний программ ашигладаг. Онгоцны систем ч ашигладаг.
SQLite бол хэдэн тэрбум төхөөрөмж дээр ажиллаж байгаа бодит, найдвартай технологи юм.
Тиймээс энэ сургалтад SQLite сурах нь "хялбаршуулсан хувилбар" сурч байгаа хэрэг биш. Та бодит хэрэгсэл сурч байна.
Шударга байя — SQLite-д хязгаар бий, түүнийг мэдэх нь чухал.
Олон сервер. Хэрэв таны API нь хэд хэдэн компьютер дээр зэрэг ажилладаг бол (том вэбсайтууд ингэдэг), тэдгээр бүгд нэг өгөгдлийн санд хандах ёстой. SQLite файл нь нэг компьютер дээр байдаг тул энэ нь ажиллахгүй. Тэр үед PostgreSQL хэрэгтэй.
Маш их зэрэг бичилт. SQLite нь зэрэг уншилтыг сайн зохицуулдаг, гэхдээ зэрэг бичилт дээр хязгаартай — нэг удаад нэг бичигч. Секундэд олон зуун бичилт хийдэг систем бол PostgreSQL рүү шилжих ёстой.
Хэрэглэгчийн эрх. PostgreSQL-д хэрэглэгч бүрд өөр эрх өгч болно. SQLite-д файлд хандах эрх л байна.
Тэгвэл хэзээ хангалттай вэ? Дийлэнх жижиг, дунд хэмжээний программд. Нэг сервер дээр ажилладаг, өдөрт хэдэн мянган хүсэлт хүлээж авдаг API-д SQLite бүрэн хангалттай. Олон бодит программ SQLite дээр production-д ажилладаг.
Мөн чухал зүйл: шилжих нь хялбар. Бид SQLModel ашиглах бөгөөд тэр нь SQLite болон PostgreSQL хоёуланд ажилладаг. Хожим шилжих шаардлага гарвал зөвхөн холболтын мөр өөрчлөгдөнө; таны бусад код бараг хэвээр үлдэнэ.
Одоо практик зүйл рүү орно. SQLite өгөгдлийн сан бол нэг файл. Түүний нэр ихэвчлэн .db эсвэл .sqlite өргөтгөлтэй байдаг — жишээ нь notes.db.
Тэр өргөтгөл нь заавал биш. SQLite файлын нэрийг тоохгүй; notes.db, data.sqlite, эсвэл myfile гэж нэрлэж болно. Гэхдээ .db нь тодорхой, түгээмэл тул бид түүнийг ашиглана.
Файл доторх агуулгыг та шууд уншиж чадахгүй. Хэрэв VS Code-оор нээх гэвэл утгагүй тэмдэгтүүд харагдана. Учир нь энэ нь текст файл биш — binary файл, машины уншихад зориулагдсан тусгай бүтэцтэй.
Энэ нь JSON файлаас том ялгаа. JSON файлыг та нээж, уншиж, гараар засаж болно. .db файлыг зөвхөн SQLite (эсвэл түүнийг ойлгодог хэрэгсэл) уншина.
Энэ нь дутагдал биш, харин давуу тал юм. Тэр тусгай бүтэц нь index, хурдан хайлт, transaction боломжтой болгодог. Хүн уншихад зориулагдаагүй ч машин ажиллахад төгс.
Одоо гар дээрээ туршъя. Бид SQLModel-ыг Бүлэг 11-т сурах тул энд зөвхөн Python-ы суурь sqlite3 модулиар жижиг туршилт хийнэ — өгөгдлийн сан бодитоор үүсэхийг харах гэж.
Төслийн хавтаст test_db.py файл үүсгэнэ:
python
# test_db.py
import sqlite3
connection = sqlite3.connect("test.db")
print("Өгөгдлийн сан үүслээ эсвэл нээгдлээ")
connection.close()
print("Хаагдлаа")Терминал дээр ((venv) идэвхтэй байх шаардлагагүй, гэхдээ байвал ч зүгээр):
python test_db.pyГаралт:
Өгөгдлийн сан үүслээ эсвэл нээгдлээ
ХаагдлааОдоо файлын жагсаалтаа хараарай
VS Code-ийн зүүн талын файлын жагсаалт дээр шинэ файл гарч ирсэн байх ёстой:
test.dbТаны эхний өгөгдлийн сан. Тэр байна — файлын жагсаалт дээр, харагдаж байна.
Хэрэв гарч ирээгүй бол файлын жагсаалтыг шинэчлээрэй (VS Code-ийн Explorer хэсгийн дээд талын refresh товч).
Юу болов
sqlite3.connect("test.db") — энэ мөр нь "test.db гэсэн өгөгдлийн санд холбогд" гэсэн үг. Гэхдээ тэр файл байхгүй байсан. SQLite юу хийсэн бэ? Өөрөө үүсгэсэн.
Энэ бол SQLite-ийн ээлтэй зан төлөв: файл байхгүй бол үүсгэдэг, байгаа бол нээдэг. Тусдаа "өгөгдлийн сан үүсгэх" алхам байхгүй.
connection.close() — холболтыг хаана. Файлтай ажиллахтай адил: нээх, ашиглах, хаах.
Одоохондоо файл нь хоосон — хүснэгт байхгүй, өгөгдөл байхгүй. Хэмжээг нь хараарай (VS Code-д файл дээр хулганаа тавихад харагдана эсвэл баруун товшоод Properties): 0 байт, эсвэл маш бага.
Хүснэгт нэмье
Одоо жинхэнэ агуулга нэмье. test_db.py-г солино:
python
# test_db.py
import sqlite3
connection = sqlite3.connect("test.db")
cursor = connection.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS notes (
id INTEGER PRIMARY KEY,
text TEXT NOT NULL,
done INTEGER DEFAULT 0
)
""")
connection.commit()
print("Хүснэгт үүслээ")
connection.close()Ажиллуулна:
python test_db.pyГаралт:
Хүснэгт үүслээОдоо test.db файлын хэмжээ нэмэгдсэн байх ёстой — хэдэн килобайт. Дотор нь хүснэгтийн бүтэц бичигдсэн.
Энэ код юу гэж байна вэ
CREATE TABLE ... гэсэн хэсэг нь SQL — өгөгдлийн сангийн хэл. Дараагийн хичээл бүхэлдээ түүнд зориулагдана тул одоо гүнзгий ойлгох шаардлагагүй. Гэхдээ товч уншъя:
CREATE TABLE IF NOT EXISTS notes — "notes гэсэн хүснэгт үүсгэ, хэрэв аль хэдийн байхгүй бол".
id INTEGER PRIMARY KEY — id гэсэн багана, бүхэл тоо, үндсэн түлхүүр (мөр бүрийг ялгах давтагдашгүй утга).
text TEXT NOT NULL — text гэсэн багана, текст, хоосон байж болохгүй.
done INTEGER DEFAULT 0 — done гэсэн багана, бүхэл тоо, default нь 0.
Энэ бол schema — өмнөх хичээлд ярьсан бүтцийн зарлал. Pydantic model-той төстэй санааг та шууд харж байна:
python
class Note(BaseModel):
id: int
text: str
done: bool = FalseТалбарын нэр, төрөл, заавал эсэх, default. Хоёулаа ижил зүйл хийж байна, зөвхөн өөр хэлээр.
connection.commit() — өөрчлөлтийг баталгаажуулна. Энэ мөргүй бол хүснэгт үүсэхгүй. Бид Бүлэг 11-т commit-ыг дэлгэрэнгүй үзнэ; одоохондоо "хадгал" гэсэн үг гэж ойлгоод орхиё.
Мөр нэмж, уншья
Сүүлийн туршилт. test_db.py-г солино:
python
# test_db.py
import sqlite3
connection = sqlite3.connect("test.db")
cursor = connection.cursor()
cursor.execute("INSERT INTO notes (text, done) VALUES (?, ?)", ("Сүү авах", 0))
cursor.execute("INSERT INTO notes (text, done) VALUES (?, ?)", ("Номоо буцаах", 1))
connection.commit()
cursor.execute("SELECT * FROM notes")
rows = cursor.fetchall()
for row in rows:
print(row)
connection.close()Ажиллуулна.
Гаралт:
(1, 'Сүү авах', 0)
(2, 'Номоо буцаах', 1)Хоёр мөр өгөгдлийн санд хадгалагдаж, уншигдлаа.
id баганыг та өгөөгүй — SQLite өөрөө 1, 2 гэж өгсөн. PRIMARY KEY зарласан бүхэл тоон багана автоматаар нэмэгддэг. Таны API-д next_id тоолуур байсныг санаж байна уу? Өгөгдлийн сан түүнийг өөрөө хийж өгч байна.
Мөр бүр tuple хэлбэрээр ирж байгааг анзаараарай — Курс 2-ын Бүлэг 5-аас танил. Энэ бол суурь sqlite3 модулийн зан төлөв бөгөөд ажиллахад тав тухтай биш. SQLModel үүнийг засах бөгөөд мөр бүрийг объект болгож өгнө.
Байнгын байдлыг батлах
Одоо хамгийн чухал туршилт. Скриптийг дахин ажиллуул:
python test_db.pyГаралт:
(1, 'Сүү авах', 0)
(2, 'Номоо буцаах', 1)
(3, 'Сүү авах', 0)
(4, 'Номоо буцаах', 1)Дөрвөн мөр. Эхний хоёр нь өмнөх ажиллалтаас үлдсэн; шинэ хоёр нь одоо нэмэгдсэн.
Энэ бол байнгын байдал (persistence). Программ дуусч, санах ой цэвэрлэгдсэн ч өгөгдөл test.db файлд үлдсэн. Дараагийн удаа программ асахад тэдгээр байрандаа байна.
Таны API-д одоо байхгүй зүйл яг энэ юм. Түвшин 4-ийн төгсгөлд таны API ижилхэн зан төлөвтэй болно: серверээ унтраа, дахин асаа, тэмдэглэлүүд хэвээр.
Энэ бол зөвхөн туршилт байсан. test_db.py болон test.db хоёрыг устгаж болно — тэдгээр нь таны төслийн жинхэнэ кодтой холбоогүй.
Хэрэв үлдээхийг хүсвэл .gitignore-д *.db мөр нэмээрэй:
.env
venv/
__pycache__/
*.pyc
*.dbЯагаад? Учир нь өгөгдлийн сангийн файл нь өгөгдөл, код биш. Тэр нь хөгжүүлэгч бүрд өөр байх ёстой, git-д орох ёсгүй. Мөн бодит өгөгдөл (хэрэглэгчийн мэдээлэл) санамсаргүй нийтлэгдэх эрсдэлээс сэргийлнэ.
Энэ мөрийг одоо нэмээрэй — Бүлэг 11-12-т бид жинхэнэ .db файл үүсгэх болно.
.db файлыг текст болгон уншиж чадахгүй гэдгийг дурдсан. Гэхдээ түүнийг харах хэрэгслүүд бий.
DB Browser for SQLite — үнэгүй, график программ. .db файлыг нээж, хүснэгт, мөрүүдийг Excel шиг харуулна. Суулгах бол sqlitebrowser.org.
VS Code өргөтгөл — "SQLite" эсвэл "SQLite Viewer" гэж хайвал хэд хэдэн өргөтгөл байна. VS Code дотроос шууд .db файл нээж харах боломжтой.
Эдгээр нь заавал биш — бид бүх ажлаа кодоор хийнэ. Гэхдээ өгөгдлөө нүдээр харах нь суралцахад маш их тусалдаг. Хэрэв та .db файл дотор юу байгааг харах хүсэлтэй бол эдгээрийн аль нэгийг суулгаж үзээрэй.
Хэрэв суулгахгүй бол ч зүгээр — бид /docs болон API-аараа дамжуулан бүх өгөгдлөө харна.
Сүүлийн тодруулга. Энэ хичээлд бид sqlite3 модулиар шууд ажилласан — CREATE TABLE, INSERT, SELECT гэсэн SQL бичсэн.
Бид цаашид ингэж ажиллахгүй. Учир нь энэ нь бүдүүлэг: SQL-ыг текст болгон бичих нь алдаатай, мөрүүд tuple болж ирдэг, Pydantic model-той холбогдохгүй.
Оронд нь бид SQLModel ашиглана (Бүлэг 11). Тэр нь:
Python class бичихэд түүнийг хүснэгт болгоно (SQL бичих шаардлагагүй).
Мөрүүдийг объект болгож буцаана (tuple биш).
Pydantic model-ын бүх чадварыг өвлөнө (validation, /docs).
Тэгэхээр яагаад энэ хичээлд түүхий SQL харуулав? Хоёр шалтгаанаар. Нэгд, өгөгдлийн сан бодитоор ажиллаж байгааг харах гэж — ямар нэг ид шид биш, файл үүсэж, мөр нэмэгдэж байгааг. Хоёрт, дараагийн хичээл бүхэлдээ SQL-ыг уншиж таних түвшинд сурахад зориулагдана. SQLModel таны өмнөөс SQL бичих боловч түүнийг таньж чаддаг байх нь алдаа засахад чухал.
Ердийн өгөгдлийн сан (PostgreSQL, MySQL) бол сервер — тусдаа программ, сүлжээ, тохируулга шаарддаг.
SQLite бол сан (library) — таны программын дотор ажилладаг, сервергүй, сүлжээгүй, тохируулгагүй.
Бүх өгөгдөл нэг файлд (.db) — гэхдээ энэ нь энгийн текст файл биш, ухаалаг бүтэцтэй binary файл.
SQLite нь Python-д аль хэдийн байгаа — суулгах шаардлагагүй (sqlite3 модуль).
SQLite бол тоглоом биш — утас, browser, олон бодит программд ажилладаг, дэлхийн хамгийн өргөн ашиглагддаг өгөгдлийн сан.
Хязгаар: олон сервер, маш их зэрэг бичилт. Дийлэнх жижиг, дунд программд хангалттай.
sqlite3.connect("test.db") — файл байхгүй бол өөрөө үүсгэнэ.
PRIMARY KEY бүхий бүхэл тоон багана автоматаар нэмэгддэг — next_id тоолуур хэрэггүй болно.
Байнгын байдал батлагдлаа: программ дуусч дахин ажиллахад өгөгдөл үлдсэн.
.gitignore-д *.db нэмнэ — өгөгдлийн сан бол өгөгдөл, код биш.
Цаашид бид түүхий SQL биш, SQLModel ашиглана (Бүлэг 11).
Одоо та SQLite гэж юу болохыг мэднэ, түүнийг ажиллахыг өөрийн нүдээр харлаа. Дараагийн хичээлд бид SQL хэл рүү орно — гэхдээ бичих түвшинд биш, уншиж таних түвшинд. SQLModel таны өмнөөс SQL бичих боловч терминал дээр алдаа гарахад тэр SQL харагдана; түүнийг таньж чаддаг байх нь айдсыг арилгаж, асуудлыг хурдан олоход тусална. Бид SELECT, INSERT, UPDATE, DELETE гэсэн дөрвөн үндсэн тушаалыг хамтдаа уншиж, тэдгээр нь таны аль хэдийн мэддэг CRUD-тай яг таарч байгааг харна.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.