Ачааллж байна...
Өмнөх хичээлд бид хүснэгт үүсгэсэн. notes.db файл байгаа, дотор нь note хүснэгт байгаа — гэхдээ хоосон. Бүтэц бэлэн, агуулга байхгүй.
Энэ хичээлд бид түүнийг дүүргэнэ. Шинэ ойлголт орж ирнэ: Session — өгөгдлийн сантай хийх нэг удаагийн яриа.
Бид тэмдэглэл нэмж, буцаан уншиж, commit яагаад чухал болохыг зориудаар мартаж үзэж ойлгоно. echo=True тань ажиллаж, таны Python код INSERT болон SELECT болж хувирахыг өөрийн нүдээр харна.
Өгөгдлийн сантай ажиллах бүрд та session нээдэг. Session бол өгөгдлийн сантай хийх нэг удаагийн яриа юм.
Ярианы бүтэц ийм байдаг:
Session нээнэ (яриа эхэлнэ).
Хэдэн үйлдэл хийнэ (нэмэх, унших, засах).
commit хийнэ (өөрчлөлтийг баталгаажуулна).
Session хаана (яриа дуусна).
Яагаад ийм бүтэц хэрэгтэй вэ? Хоёр шалтгаанаар.
Нэгд, нөөц. Өгөгдлийн сантай холбогдох нь нөөц зарцуулдаг. Session нээх, хаах нь тэр нөөцийг зохион байгуулна — хэрэглээд суллана. Курс 2-ын Бүлэг 13-ын with болон context manager-ийн санаа энд шууд хамаарна.
Хоёрт, transaction. Бүлэг 10-ын Хичээл 1-т ярьсныг санаж байна уу — "бүгд болно, эсвэл юу ч болохгүй". Session нь тэр баталгааг өгдөг. Session дотор хийсэн бүх өөрчлөлт commit хүртэл түр зуурын байдаг. commit хийвэл бүгд хадгалагдана; хийхгүй бол бүгд хаягдана.
Бүлэг 10-ын агуулахын зүйрлэлээ үргэлжлүүлье.
Та агуулах руу очиж, няравтай ярилцана. Яриа ийм явна:
Яриа эхэлнэ. Та орж ирж, "сайн байна уу" гэнэ. Нярав дэвтрээ нээнэ.
Захиалга өгнө. "Энэ барааг бүртгэлд нэм." "Тэр барааг ав." "Энийг өөрчил." Нярав тэмдэглэж авна — гэхдээ хараахан албан ёсны дэвтэрт бичээгүй, зөвхөн ноорог дээр.
Баталгаажуулна. Та "тэгье, бүгдийг бүртгээрэй" гэнэ. Нярав ноорогоо албан ёсны дэвтэрт шилжүүлнэ. Энэ бол commit.
Яриа дуусна. Та гарч явна. Нярав дэвтрээ хаана.
Хэрэв та баталгаажуулахгүйгээр гарч явбал? Нярав ноорогоо хаяна. Юу ч бүртгэгдэхгүй. Тэр бол commit хийхгүй байх нь юу гэсэн үг вэ гэдгийн хариу.
Энэ нь ач холбогдолтой: та эргэлзэж байвал, эсвэл дунд нь алдаа гарвал — юу ч болоогүй мэт үлдэнэ. Хагас төлөв гэж байхгүй.
Session-ыг with бүтцээр нээдэг. Курс 2-ын Бүлэг 13-т та with-ыг сурсан — файл ажиллуулахад ашигладаг байсан:
python
with open("file.txt") as f:
content = f.read()
# файл автоматаар хаагданаSession ч яг ижил:
python
with Session(engine) as session:
# энд ажиллана
# session автоматаар хаагданаwith блок дуусахад session автоматаар хаагдана — та гараар хаах шаардлагагүй. Хэрэв алдаа гарсан ч хаагдана.
Энэ бол context manager-ийн гол ашиг: нөөц үргэлж суллагддаг. with-гүйгээр бол session.close()-ыг гараар дуудах ёстой байсан, мартвал холболт нээлттэй үлдэнэ.
db_test.py файлаа дараах кодоор солино:
python
# db_test.py
from sqlmodel import SQLModel, Field, Session, create_engine
class Note(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
text: str
priority: str = "энгийн"
done: bool = False
engine = create_engine("sqlite:///notes.db", echo=True)
SQLModel.metadata.create_all(engine)
with Session(engine) as session:
note = Note(text="Сүү авах", priority="чухал")
session.add(note)
session.commit()
print("Тэмдэглэл нэмэгдлээ")Санамж: хэрэв та өмнөх хичээлд tags талбар нэмээд .db файлаа устгаагүй бол одоо устгана уу. Model нь tags-гүй тул шинэ файл хэрэгтэй.
Ажиллуулна:
python db_test.pyГаралт (гол хэсэг):
... PRAGMA main.table_info("note")
... COMMIT
... BEGIN (implicit)
... INSERT INTO note (text, priority, done) VALUES (?, ?, ?)
... [generated in 0.00008s] ('Сүү авах', 'чухал', 0)
... COMMIT
Тэмдэглэл нэмэгдлээГаралтыг унших
INSERT INTO note (text, priority, done) VALUES (?, ?, ?)
Бүлэг 10-ын Хичээл 3-т сурсан INSERT тушаал. SQLModel таны Python кодоос үүсгэсэн.
? тэмдэгүүд нь орлуулагч — жинхэнэ утгууд доорх мөрөнд байна: ('Сүү авах', 'чухал', 0).
Яагаад утгыг шууд SQL дотор бичдэггүй вэ? Аюулгүй байдлын шалтгаантай — энэ бол SQL injection гэсэн халдлагаас сэргийлэх стандарт арга. Хэрэв утгыг шууд SQL текстэд наавал хортой хэрэглэгч тусгай тэмдэгт илгээж SQL-ыг өөрчилж болно. Орлуулагч ашиглавал утга үргэлж зөвхөн утга хэвээр үлддэг.
Энэ бол SQLModel ашиглахын бас нэг далд ашиг: та SQL injection-оос автоматаар хамгаалагдсан. Түүхий SQL бичдэг байсан бол энэ талаар өөрөө бодох ёстой байсан.
done нь 0 болж хадгалагдсаныг анзаараарай — Бүлэг 10-т ярьсанчлан SQLite-д BOOLEAN байхгүй. SQLModel False-ыг 0 болгон хөрвүүлсэн.
id нь INSERT-д ороогүй — өгөгдлийн сан өөрөө өгнө.
COMMIT — өөрчлөлт баталгаажлаа.
Кодын задаргаа
python
with Session(engine) as session:Session нээж байна. engine нь өгөгдлийн сангийн хаягийг мэднэ; Session нь түүнийг ашиглан холбогдоно.
python
note = Note(text="Сүү авах", priority="чухал")Энэ бол зүгээр л Python объект үүсгэж байна. Курс 2-ын class, dataclass-тай яг адил. Өгөгдлийн сантай ямар ч холбоогүй — энэ мөчид зөвхөн санах ойд байгаа объект.
done өгөөгүй тул default (False). id өгөөгүй тул None.
python
session.add(note)"Энэ объектыг нэмэхээр төлөвлө." Хараахан хадгалаагүй — няравын ноорог дээр бичсэн.
python
session.commit()"Баталгаажуул." Одоо INSERT бодитоор ажиллаж, өгөгдөл файлд бичигдэнэ.
Энэ гурван алхмыг санаж авах нь чухал: объект үүсгэх -> add -> commit.
Одоо зориудаар алдаа гаргая — энэ нь commit-ийн утгыг тодруулна.
db_test.py-г солино (эхлээд notes.db-г устгана, цэвэр эхлэхийн тулд):
python
# db_test.py
from sqlmodel import SQLModel, Field, Session, create_engine
class Note(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
text: str
priority: str = "энгийн"
done: bool = False
engine = create_engine("sqlite:///notes.db", echo=True)
SQLModel.metadata.create_all(engine)
with Session(engine) as session:
note = Note(text="Энэ тэмдэглэл хадгалагдахгүй")
session.add(note)
# session.commit() — ЗОРИУДААР МАРТСАН
print("Дууслаа")Ажиллуулна.
Гаралт (гол хэсэг):
CREATE TABLE note (...)
... COMMIT
ДууслааINSERT мөр огт байхгүй.
Хүснэгт үүссэн (CREATE TABLE), гэхдээ тэмдэглэл нэмэгдээгүй. session.add(note) гэж бичсэн ч гэсэн.
Юу болов? Session нь add-ыг зөвхөн тэмдэглэж авсан. commit дуудагдаагүй тул өөрчлөлт баталгаажаагүй. with блок дуусахад session хаагдаж, баталгаажаагүй бүх өөрчлөлт хаягдсан.
Нярав ноорогоо хаясан.
Батлах
Одоо уншиж үзье. db_test.py-д уншилтын хэсэг нэмнэ:
python
# db_test.py (сүүлийн хэсгийг солино)
from sqlmodel import SQLModel, Field, Session, create_engine, select
# ... model болон engine ижил ...
with Session(engine) as session:
note = Note(text="Энэ тэмдэглэл хадгалагдахгүй")
session.add(note)
# commit байхгүй
with Session(engine) as session:
notes = session.exec(select(Note)).all()
print(f"Хүснэгтэд {len(notes)} тэмдэглэл байна")Ажиллуулна.
Гаралт (төгсгөл):
... SELECT note.id, note.text, note.priority, note.done FROM note
Хүснэгтэд 0 тэмдэглэл байнаТэг. Тэмдэглэл хадгалагдаагүй нь батлагдлаа.
Дүрэм: commit-гүй бол өөрчлөлт хадгалагдахгүй. Энэ бол SQLModel-той ажиллахад хамгийн түгээмэл эхлэгчийн алдаа. Хэрэв та "яагаад миний өгөгдөл хадгалагдахгүй байна вэ?" гэж бодож байвал — эхлээд commit байгаа эсэхийг шалгаарай.
Одоо уншилтыг зөв сурцгаая. Эхлээд notes.db-г устгаад, db_test.py-г солино:
python
# db_test.py
from sqlmodel import SQLModel, Field, Session, create_engine, select
class Note(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
text: str
priority: str = "энгийн"
done: bool = False
engine = create_engine("sqlite:///notes.db", echo=True)
SQLModel.metadata.create_all(engine)
# Гурван тэмдэглэл нэмэх
with Session(engine) as session:
session.add(Note(text="Сүү авах", priority="чухал"))
session.add(Note(text="Номоо буцаах", done=True))
session.add(Note(text="Тайлан бичих", priority="яаралтай"))
session.commit()
print("--- Нэмэгдлээ ---")
# Бүгдийг унших
with Session(engine) as session:
notes = session.exec(select(Note)).all()
for note in notes:
print(note.id, note.text, note.priority, note.done)Ажиллуулна.
Гаралт (гол хэсэг):
... INSERT INTO note (text, priority, done) VALUES (?, ?, ?)
... [generated in 0.00009s] ('Сүү авах', 'чухал', 0)
... INSERT INTO note (text, priority, done) VALUES (?, ?, ?)
... [cached since ...] ('Номоо буцаах', 'энгийн', 1)
... INSERT INTO note (text, priority, done) VALUES (?, ?, ?)
... [cached since ...] ('Тайлан бичих', 'яаралтай', 0)
... COMMIT
--- Нэмэгдлээ ---
... BEGIN (implicit)
... SELECT note.id, note.text, note.priority, note.done FROM note
... [generated in 0.00011s] ()
1 Сүү авах чухал False
2 Номоо буцаах энгийн True
3 Тайлан бичих яаралтай FalseГурван тэмдэглэл хадгалагдаж, буцаан уншигдлаа.
Гол зүйлсийг анзаарах
id автоматаар өгөгдсөн. 1, 2, 3. Та юу ч хийгээгүй. Таны API-д next_id тоолуур байсныг санаж байна уу? Өгөгдлийн сан түүнийг үнэгүй хийж байна.
done нь True/False болж буцлаа. Өгөгдлийн санд 0/1 байсан, гэхдээ Python-д ирэхдээ жинхэнэ bool болсон. SQLModel хөрвүүлэлтийг хийсэн — Бүлэг 11-ийн Хичээл 1-т ярьсан "төрөл хөрвүүлэхгүй" асуудал шийдэгдсэн.
Мөр бүр объект. note.id, note.text — цэгээр, row[0], row[1] биш. Түүхий sqlite3-ийн tuple асуудал шийдэгдсэн.
Гурван INSERT нэг COMMIT-тэй. Гурван тэмдэглэлийг нэг commit-оор хадгаллаа. Энэ бол transaction-ийн ашиг: гурвуулаа хамт хадгалагдана, эсвэл гурвуулаа хадгалагдахгүй. Хэрэв дунд нь алдаа гарвал бүгд хаягдана.
select-ийн задаргаа
python
notes = session.exec(select(Note)).all()Гурван хэсэг байна.
select(Note) — асуулт бэлдэж байна. "Note хүснэгтээс сонго." Энэ нь SQL-ын SELECT * FROM note-тэй тэнцүү. Гэхдээ энэ мөр өөрөө юу ч ажиллуулаагүй — зөвхөн асуултын тодорхойлолт үүсгэсэн.
session.exec(...) — асуултыг ажиллуулна. Одоо SQL өгөгдлийн сан руу явна.
.all() — бүх үр дүнг жагсаалт болгож авна.
Гурван алхмыг тусад нь бичиж болно, ойлгомжтой болгохын тулд:
python
statement = select(Note) # 1. Асуулт бэлдэх
results = session.exec(statement) # 2. Ажиллуулах
notes = results.all() # 3. Бүгдийг авахПрактикт нэг мөрөнд бичдэг, гэхдээ гурван алхам болж байгааг мэдэх нь тустай.
Бүгдийг биш, ганц мөр авах хоёр арга бий.
first() — эхнийхийг авах
python
# db_test.py (уншилтын хэсгийг солино)
with Session(engine) as session:
note = session.exec(select(Note)).first()
print(note.id, note.text)Гаралт:
1 Сүү авах.first() нь эхний мөрийг буцаана. Хэрэв мөр байхгүй бол None буцаана — алдаа гаргахгүй.
session.get() — id-гаар авах
Хамгийн түгээмэл хэрэглээ: тодорхой id-тай мөрийг авах. Үүнд тусгай, илүү энгийн арга бий:
python
# db_test.py (уншилтын хэсгийг солино)
with Session(engine) as session:
note = session.get(Note, 2)
print(note.id, note.text, note.done)
missing = session.get(Note, 999)
print(f"999-р тэмдэглэл: {missing}")Гаралт:
... SELECT note.id, note.text, note.priority, note.done FROM note WHERE note.id = ?
... [generated in 0.00010s] (2,)
2 Номоо буцаах True
... SELECT ... WHERE note.id = ?
... (999,)
999-р тэмдэглэл: Nonesession.get(Note, 2) — "Note хүснэгтээс id нь 2 байгаа мөрийг ав."
SQL-д WHERE note.id = ? гэсэн нөхцөл орсныг анзаараарай — Бүлэг 10-ын WHERE танил.
Байхгүй id-д None буцна, алдаа гарахгүй. Энэ нь чухал: Бүлэг 12-т бид None эсэхийг шалгаж, HTTPException(404) шидэх болно. Таны find_note функцийн загвар яг ийм байх болно.
session.get нь select + where + first-ээс илүү энгийн, илүү хурдан — үндсэн түлхүүрээр хайхад тусгайлан оновчлогдсон. Id-гаар хайхад үргэлж түүнийг ашиглана.
Нөхцөлтэй хайлт:
python
# db_test.py (уншилтын хэсгийг солино)
with Session(engine) as session:
# Зөвхөн дуусаагүй тэмдэглэл
statement = select(Note).where(Note.done == False)
pending = session.exec(statement).all()
print("Дуусаагүй:")
for note in pending:
print(" ", note.text)
# Зөвхөн чухал
statement = select(Note).where(Note.priority == "чухал")
important = session.exec(statement).all()
print("Чухал:")
for note in important:
print(" ", note.text)Гаралт (гол хэсэг):
... SELECT ... FROM note WHERE note.done = 0
Дуусаагүй:
Сүү авах
Тайлан бичих
... SELECT ... FROM note WHERE note.priority = ?
... ('чухал',)
Чухал:
Сүү авахwhere-ийн задаргаа
python
select(Note).where(Note.done == False).where(...) нь SQL-ын WHERE-тэй яг тэнцүү.
Дотор нь Note.done == False — class-ын талбарыг ашиглаж байна, объектынхыг биш. Note.done гэдэг нь "note хүснэгтийн done багана" гэсэн үг.
Энэ нь эхэндээ хачирхалтай харагддаг: Note.done == False гэсэн харьцуулалт True/False буцаах ёстой мэт. Гэхдээ SQLModel (үнэндээ SQLAlchemy) энэ синтаксыг дахин тодорхойлсон — тэр нь харьцуулалт хийхгүй, харин "done багана нь False-тэй тэнцүү" гэсэн нөхцөлийн объект үүсгэдэг. Тэр объект дараа нь SQL болж хувирна.
Энэ бол ухаалаг заль мэх бөгөөд та түүнийг гүнзгий ойлгох шаардлагагүй. Зөвхөн загварыг санаж авах хангалттай: Model.талбар == утга.
Олон нөхцөл:
python
select(Note).where(Note.done == False, Note.priority == "чухал")Таслалаар тусгаарласан нөхцөлүүд нь SQL-д AND болно.
Түгээмэл занга: == True/False
Python-д ихэвчлэн if note.done: гэж бичдэг, if note.done == True: гэж биш. Гэхдээ where-д заавал == ашиглах ёстой:
python
select(Note).where(Note.done == False) # зөв
select(Note).where(not Note.done) # БУРУУХоёр дахь нь ажиллахгүй, учир нь Python-ы not нь SQLModel-ийн нөхцөлийн объектыг ойлгодоггүй.
Энэ бол SQLModel-той ажиллахад дасах ёстой цөөн онцлогийн нэг юм.
Бүлэг 10-ын ORDER BY, LIMIT, OFFSET нь SQLModel-д ч байна:
python
# db_test.py (уншилтын хэсгийг солино)
with Session(engine) as session:
# Буурахаар эрэмбэлж, эхний хоёрыг авах
statement = select(Note).order_by(Note.id.desc()).limit(2)
notes = session.exec(statement).all()
for note in notes:
print(note.id, note.text)Гаралт (гол хэсэг):
... SELECT ... FROM note ORDER BY note.id DESC LIMIT ? OFFSET ?
... (2, 0)
3 Тайлан бичих
2 Номоо буцаах.order_by(Note.id.desc()) — id-гаар буурахаар. .asc() бол өсөхөөр (default).
.limit(2) — хамгийн ихдээ хоёр мөр.
.offset(1) — эхний нэгийг алгасах (энд ашиглаагүй, гэхдээ байдаг).
Эдгээрийг гинжлэн холбож болно — select(Note).where(...).order_by(...).limit(...).offset(...). Дараалал хамаагүй.
Бүлэг 13-т бид limit болон offset-ыг таны list_params dependency-тэй холбож, жинхэнэ өгөгдлийн сангийн pagination хийнэ. Бүлэг 8-ын Хичээл 2-т амласан зүйл яг энд биелнэ.
Нэг практик асуудал. Тэмдэглэл нэмсний дараа түүний id-г мэдэхийг хүсвэл яах вэ?
python
with Session(engine) as session:
note = Note(text="Шинэ тэмдэглэл")
session.add(note)
session.commit()
print(note.id) # юу гарах вэ?Ажиллуулбал ойролцоогоор ийм алдаа гарч болно, эсвэл None гарна — учир нь commit хийсний дараа объект нь "хуучирсан" (stale) болдог.
Шийдэл нь refresh:
python
with Session(engine) as session:
note = Note(text="Шинэ тэмдэглэл")
session.add(note)
session.commit()
session.refresh(note)
print(note.id, note.text)Гаралт:
... INSERT INTO note ...
... COMMIT
... SELECT note.id, ... FROM note WHERE note.id = ?
4 Шинэ тэмдэглэлsession.refresh(note) нь объектыг өгөгдлийн сангаас дахин уншиж, шинэчилдэг. Одоо note.id нь бодит утгатай.
Загвар: add -> commit -> refresh. Энэ гурвалыг та Бүлэг 12-т байнга ашиглана, учир нь API нь шинээр үүсгэсэн объектыг id-тэй нь буцаах ёстой.
commit мартах
Дээр дэлгэрэнгүй үзсэн. Хамгийн түгээмэл алдаа. Өгөгдөл чимээгүй алга болно.
Шинж тэмдэг: add хийсэн, алдаа гараагүй, гэхдээ уншихад юу ч байхгүй.
Засвар: session.commit() нэмэх.
with мартах
python
session = Session(engine)
note = Note(text="...")
session.add(note)
session.commit()
# session.close() мартсанЭнэ ажиллана, гэхдээ session хаагдаагүй тул холболт нээлттэй үлдэнэ. Олон удаа давтагдвал холболтууд хуримтлагдана.
Засвар: үргэлж with ашигла. Тэр нь хаалтыг баталгаажуулна.
select-ийг exec-гүйгээр ашиглах
python
notes = select(Note).all() # session.exec байхгүйГаралт:
AttributeError: 'SelectOfScalar' object has no attribute 'all'select(...) нь зөвхөн асуулт бэлддэг; ажиллуулахын тулд session.exec(...) хэрэгтэй.
Засвар: session.exec(select(Note)).all().
session.get-д хүснэгтийн нэр өгөх
python
note = session.get("note", 2) # текст — буруу
note = session.get(Note, 2) # class — зөвsession.get-ийн эхний параметр нь class, хүснэгтийн нэр биш.
where-д ганц тэнцүү
python
select(Note).where(Note.done = False) # нэг тэнцүү — SyntaxError
select(Note).where(Note.done == False) # хоёр тэнцүү — зөвPython-ы ердийн дүрэм: = бол оноолт, == бол харьцуулалт. where-д харьцуулалт хэрэгтэй.
Session-ыг дахин ашиглах
python
with Session(engine) as session:
notes = session.exec(select(Note)).all()
# with-ээс гарсны дараа
print(notes[0].text) # алдаа гарч болноSession хаагдсаны дараа түүнээс авсан объектууд бүрэн ажиллахгүй байж болно (ялангуяа хараахан уншаагүй талбарууд). Аюулгүй арга: бүх ажлыг with блок дотор хий.
Бүлэг 12-т FastAPI-ийн dependency нь энэ асуудлыг цэвэрхэн шийдэх болно.
Хүсвэл олон тэмдэглэл нэмээд, янз бүрийн where нөхцөл туршиж үзээрэй. echo=True тул SQL-ыг харна — Python код хэрхэн SQL болж хувирахыг ажиглах нь холбоог бататгана.
Сонирхвол commit-ыг зориудаар мартаад, дараа нь нэмээд, ялгааг хараарай. Энэ алдааг нэг удаа өөрийн нүдээр харсан хүн дахин мартах магадлал бага.
Хэрэв DB Browser for SQLite суулгасан бол notes.db-г нээж, note хүснэгтийн мөрүүдийг харна уу. done багана нь 0/1 байхыг ажиглаарай — Python-д True/False байсан ч.
Session бол өгөгдлийн сантай хийх нэг удаагийн яриа: нээх -> ажиллах -> commit -> хаах.
with Session(engine) as session: — with нь хаалтыг баталгаажуулна (Курс 2-ын context manager).
Нэмэх гурвал: объект үүсгэх -> session.add(...) -> session.commit().
commit-гүй бол өөрчлөлт хаягдана — хамгийн түгээмэл эхлэгчийн алдаа.
Уншилт: session.exec(select(Note)).all() — select бэлдэнэ, exec ажиллуулна, .all() жагсаалт болгоно.
session.get(Note, id) — id-гаар хайх хамгийн энгийн арга; байхгүй бол None буцаана (алдаа биш).
Шүүлт: .where(Note.done == False) — class-ын талбар ашиглана, == заавал (not ажиллахгүй).
.order_by(...), .limit(...), .offset(...) — гинжлэн холбоно; Бүлэг 13-т pagination-д ашиглана.
session.refresh(note) — commit-ийн дараа объектыг шинэчилж, id-г авна. Загвар: add -> commit -> refresh.
id автоматаар өгөгдөнө; bool нь 0/1 болж хадгалагдаж, True/False болж буцна.
Утга нь SQL-д орлуулагчаар (?) явдаг — SQL injection-оос автомат хамгаалалт.
Одоо та өгөгдөл нэмж, унших, шүүх, эрэмбэлэх чадвартай боллоо. CRUD-ийн эхний хоёр үсэг — Create болон Read — өгөгдлийн сангийн түвшинд таны гарт байна.
Дараагийн хичээлд бид үлдсэн хоёрыг нэмнэ: Update (засах) болон Delete (устгах). Тэдгээр нь add/commit-ээс арай өөр загвартай бөгөөд нэг сонирхолтой онцлогтой: засахдаа add дуудах шаардлагагүй, учир нь SQLModel объектын өөрчлөлтийг өөрөө ажигладаг. Тэр хичээлийн дараа таны CRUD үг хэллэг өгөгдлийн сангийн түвшинд бүрэн болж, бид API-даа залгахад бэлэн болно.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.