Ачааллж байна...
Бүлэг 10-ын турш бид PostgreSQL-тэй psql ба pgAdmin-оор, гараар ярьсан. Гэвч бодит програмд хүн query бичдэггүй — програм бичдэг. FastAPI сургалтад таны Номын сангийн API SQLModel-ээр дамжуулан SQLite файлтай ярьж байсан. Энэ бүлэгт бид тэр яриаг PostgreSQL руу шилжүүлнэ. Бүлэг 10-ын эхний хичээлийн зүйрлэлээр: одоо таны Python програм архивын албаны цонхны өмнө ирж зогсоно.
Энэ хичээлд Python-оос PostgreSQL-тэй холбогдох бүх хэсгийг нэг бүрчлэн угсарна. Эхлээд хэрэгтэй сангуудыг суулгана — ялангуяа драйвер гэж нэрлэгддэг, SQL-ийг сүлжээгээр server руу зөөдөг тусгай сан. Дараа нь холболтын хаяг (URL)-ийг хэсэг бүрээр нь задалж, түүнийг кодонд биш, орчны хувьсагчид хадгалах дадлыг сурна. Эцэст нь холболт тогтоож, анхны query-гээ Python-оос ажиллуулна.
Хичээлийн чухал хэсэг нь алдаанууд. Бүлэг 10-т psql-ийн холболтын дөрвөн алдааг уншсан бол одоо тэдгээр нь Python-ы traceback-ийн дотор, хэд хэдэн давхарга дунд нуугдаж гарч ирнэ. Бид тэдгээрийг давхарга бүрээр нь уншиж сурна. Мөн Python-д онцгой нэг баримтыг мэдэх болно: холболтын алдаа engine үүсгэх мөчид биш, анх холбогдох мөчид гардаг.
Энэ хичээлийг бичих үед SQLAlchemy-ийн одоогийн хувилбарын цуврал 2.1, PostgreSQL-ийн Python драйвер нь psycopg (3-р хувилбар) байсан. SQLModel нь SQLAlchemy дээр суурилдаг тул бүх код хоёуланд нь ажиллана.
Архивын албанд захиа илгээх гэж байна гэж бодъё. Захианы дугтуй дээр хэд хэдэн мэдээлэл бичигдэх ёстой: ямар төрлийн байгууллага (архив), хүргэлтийн үйлчилгээ (шуудан), хэний нэрээр, ямар нууц үгтэй, ямар хаягт, хэддүгээр цонх, хэддүгээр өрөө. Нэг мэдээлэл дутуу эсвэл буруу бол захиа хүрэхгүй — буруу хаяг, хаалттай цонх, танихгүй нэр.
Холболтын URL бол яг тэр дугтуй. Харин драйвер бол шуудан зөөгч. SQLAlchemy таны Python кодыг SQL болгон хувиргадаг — тэр нь захиа бичигч. Гэвч бичсэн захиаг PostgreSQL server хүртэл хүргэж, хариуг нь буцааж авчрахын тулд PostgreSQL-ийн "хэлээр" сүлжээгээр ярьж чаддаг тусгай зөөгч хэрэгтэй. SQLite-д ийм зөөгч хэрэггүй байсан — Бүлэг 10-т сурсанчлан SQLite програмын дотор амьдардаг тул захиа бичигч дэвтэрт шууд бичдэг байсан. Python-ы стандарт сан SQLite-ийн дэмжлэгийг агуулдаг ч PostgreSQL-ийн зөөгчийг агуулдаггүй — тиймээс түүнийг тусад нь суулгана.
Энэ бүлгийн дасгалуудад зориулж шинэ хавтас, тусдаа виртуал орчин үүсгэнэ. Өмнөх сургалтуудын зүйрлэлээр виртуал орчин бол тусдаа өрөө — энэ төслийн сангууд бусад төсөлтэй холилдохгүй. PowerShell-д:
powershell
cd $HOME\Documents\sql-course
mkdir pg-practice
cd pg-practice
python -m venv .venv
.venv\Scripts\Activate.ps1Урилгын өмнө (.venv) гарч ирвэл орчин идэвхжсэн. Одоо хоёр сан суулгана:
powershell
pip install sqlmodel "psycopg[binary]"Энэ тушаал юу гэж хэлж байна вэ гэвэл: “SQLModel-ийг (түүнтэй хамт SQLAlchemy-г), мөн psycopg драйверийг урьдчилан бүтээгдсэн хэлбэрээр нь суулга.” [binary] гэсэн нэмэлт нь psycopg-ийн Windows-д бэлэн хөрвүүлсэн хувилбарыг сонгодог — үүнгүйгээр суулгахад нэмэлт програм хангамж шаардагдаж болно. Хашилт нь PowerShell дөрвөлжин хаалтыг өөрийн утгаар ойлгохоос сэргийлнэ. Суулгалт дуусахад Successfully installed ... psycopg-3.x ... sqlalchemy-2.x ... sqlmodel-... гэх мэт мөр гарна.
FastAPI сургалтад таны engine ойролцоогоор ийм мөртэй байсан:
python
engine = create_engine("sqlite:///library.db")PostgreSQL-ийн хувьд URL урт болно:
postgresql+psycopg://postgres:my_password@localhost:5432/libraryЭнэ мөрийг хэсэг бүрээр нь задалъя — зүйрлэлийн дугтуйн мөр бүр:
postgresql +psycopg :// postgres : my_password @ localhost : 5432 / library
────────── ──────── ──────── ─────────── ───────── ──── ───────
өгөгдлийн драйвер хэрэглэгч нууц үг хаяг порт өгөгдлийн
сангийн сан
төрөлpostgresql — ямар төрлийн өгөгдлийн сан. SQLAlchemy үүнийг хараад PostgreSQL-ийн аялгуугаар (dialect) SQL бичнэ — Бүлэг 10-т тэмдэглэсэн group_concat ба string_agg-ийн ялгаа гэх мэт.
+psycopg — ямар драйвер. Зөөгчийг ил тод нэрлэх нь чухал: SQLAlchemy олон PostgreSQL драйверийг дэмждэг бөгөөд нэрлээгүй үед аль нэгийг нь анхдагчаар хайдаг — хэрэв тэр нь суугаагүй бол алдаа гарна. Энэ сургалтад бид үргэлж +psycopg гэж бичнэ.
:// — төрлийн мэдээлэл ба холболтын мэдээллийг тусгаарлагч.
postgres:my_password — хэрэглэгчийн нэр, хоёр цэг, нууц үг. Бүлэг 10-т тогтоосон superuser ба түүний нууц үг. my_password-ийн оронд өөрийн нууц үгээ бичнэ.
@ — "нэвтрэх мэдээлэл дуусав, одоо хаяг эхэлнэ."
localhost:5432 — хаяг ба порт. localhost бол "энэ компьютер", 5432 бол Бүлэг 10-ын суулгалтын үеийн цонхны дугаар.
/library — аль өгөгдлийн сан. Бүлэг 10-т CREATE DATABASE library;-ээр үүсгэсэн өрөө.
SQLite-ийн URL-тай харьцуулахад төрөл ба өгөгдлийн сангийн нэр бий, харин хэрэглэгч, нууц үг, хаяг, порт байхгүй — учир нь файлд нэвтрэх шаардлагагүй. Бүлэг 10-ын psql-ийн холболтын алдаануудыг санаарай: server, хэрэглэгч, нууц үг, өгөгдлийн сан. URL-ийн хэсэг бүр тэдгээрийн нэгтэй шууд харгалзана — алдаа гарвал аль хэсэг буруу болохыг мессеж хэлж өгнө.
Дээрх URL-д нууц үг ил тод бичигдсэн. Хэрэв энэ мөрийг Python файлд шууд бичвэл файл Git-д орж, GitHub руу явж, хэн нэгэн таны нууц үгийг уншина. "Хөгжүүлэгчийн хэрэгсэл" сургалтад .gitignore-ийн тухай сурсан бол энэ асуудал танил. Шийдэл: URL-ийг орчны хувьсагчид (environment variable) хадгалж, код тэр хувьсагчаас уншина.
PowerShell-д (өөрийн нууц үгээр):
powershell
$env:DATABASE_URL = "postgresql+psycopg://postgres:my_password@localhost:5432/library"Энэ мөр юу гэж хэлж байна вэ гэвэл: "энэ PowerShell цонхны турш DATABASE_URL гэсэн хувьсагч энэ утгатай байна." Бүлэг 10-ын PGCLIENTENCODING-тэй адил энэ нь зөвхөн тухайн цонхонд хүчинтэй — шинэ цонх нээвэл дахин тогтооно. Бодит төслүүдэд энэ утгыг .env нэртэй файлд бичиж, тэр файлыг .gitignore-д нэмж, програм эхлэхэд уншдаг. Энэ сургалтын төгсгөлийн төсөлд ингэж хийнэ. Одоохондоо PowerShell-ийн хувьсагч хангалттай.
Нэг шударга анхааруулга: хэрэв таны нууц үг @, :, /, # гэх мэт тэмдэгт агуулдаг бол URL эвдэрнэ — жишээ нь нууц үг дэх @ нь "хаяг эхэллээ" гэж ойлгогдоно. Ийм нууц үгийн тэмдэгтүүдийг URL-д тусгай хэлбэрээр кодлох хэрэгтэй (@ нь %40 болно). Хамгийн хялбар нь Бүлэг 10-ын зөвлөмжийн дагуу латин үсэг, тоонуудаас бүрдсэн нууц үг сонгох.
pg-practice хавтсанд connect_test.py файл үүсгэнэ:
python
import os
from sqlalchemy import create_engine, text
database_url = os.environ["DATABASE_URL"]
engine = create_engine(database_url, echo=True)
with engine.connect() as connection:
result = connection.execute(text("SELECT version()"))
print(result.scalar())Мөр бүрийг уншъя. os.environ["DATABASE_URL"] нь Алхам 3-ын орчны хувьсагчийг уншина — нууц үг кодонд огт бичигдээгүй. create_engine(database_url, echo=True) нь FastAPI сургалтын танил мөр, зөвхөн URL нь өөр; echo=True нь Бүлэг 1-ийн "Туршаад үзээрэй" хэсэгт ашигласан тохиргоо — SQLAlchemy илгээсэн SQL бүрийг терминалд хэвлэнэ. engine.connect() нь server-тэй бодит холболт нээж, with блок дуусахад автоматаар хаана. text("SELECT version()") нь SQL текстийг SQLAlchemy-д "энэ бол бэлэн SQL, хувиргахгүйгээр илгээ" гэж хэлдэг. result.scalar() нь үр дүнгийн эхний мөрийн эхний утгыг авна — Бүлэг 9-ийн scalar subquery-тэй ижил санаа: ганц утга.
Ажиллуулна:
powershell
python connect_test.pyҮр дүн:
INFO sqlalchemy.engine.Engine select pg_catalog.version()
INFO sqlalchemy.engine.Engine [raw sql] {}
INFO sqlalchemy.engine.Engine select current_schema()
INFO sqlalchemy.engine.Engine [raw sql] {}
INFO sqlalchemy.engine.Engine show standard_conforming_strings
INFO sqlalchemy.engine.Engine [raw sql] {}
INFO sqlalchemy.engine.Engine BEGIN (implicit)
INFO sqlalchemy.engine.Engine SELECT version()
INFO sqlalchemy.engine.Engine [generated in 0.00012s] {}
PostgreSQL 18.0, compiled by Visual C++ build 1944, 64-bit
INFO sqlalchemy.engine.Engine ROLLBACKЭнэ гаралтыг дээрээс доош уншъя. Эхний гурван query-г бид бичээгүй — SQLAlchemy анх холбогдохдоо server-ийн хувилбар, анхдагч schema, нэг тохиргоог шалгадаг. Энэ бол Бүлэг 1-ийн "далд байсан SQL"-ийн бас нэг жишээ: та нэг query бичсэн, гэвч server дөрвийг хүлээн авсан. Дараа нь BEGIN (implicit) — SQLAlchemy таны query-г transaction дотор ажиллуулахаар эхлүүлсэн. Дараа нь бидний SELECT version(), үр дүн хэвлэгдсэн. Эцэст нь ROLLBACK — with блок дуусахад бид юуг ч хадгалах (commit) хүсээгүй тул SQLAlchemy transaction-ийг цуцалсан. SELECT юуг ч өөрчлөөгүй тул энэ хор хөнөөлгүй, гэвч хэрэв бид INSERT хийсэн бол тэр нь алга болох байсан. Энэ BEGIN ба ROLLBACK-ийн жинхэнэ утгыг Бүлэг 12-т бүрэн нээнэ — одоохондоо “SQLAlchemy-ийн холболт өөрчлөлтийг өөрөө хадгалдаггүй” гэдгийг тэмдэглээрэй.
Жишээ 1: номын сангийн өгөгдлийг Python-оос унших
Холболт ажиллаж байна. Одоо Бүлэг 10-т үүсгэсэн library өгөгдлийн сангийн өгөгдлийг уншъя. connect_test.py-ийн with блокийг солино (echo-г унтраая — гаралт цэвэрхэн болно):
python
import os
from sqlalchemy import create_engine, text
engine = create_engine(os.environ["DATABASE_URL"])
with engine.connect() as connection:
count = connection.execute(text("SELECT COUNT(*) FROM books")).scalar()
print(f"Номын тоо: {count}")
rows = connection.execute(
text("SELECT title, year FROM books ORDER BY year LIMIT 3")
)
for row in rows:
print(row.title, row.year)Үр дүн:
Номын тоо: 8
Монголын нууц товчоо 1240
Миний нутаг 1933
Учиртай гурван толгой 1934Энэ код юу гэж хэлж байна вэ гэвэл: “PostgreSQL-ийн library өгөгдлийн санд холбогдож, номын тоог ганц утга болгон хэвлэ; дараа нь хамгийн эртний гурван номын нэр, оныг мөр мөрөөр хэвлэ.” SQL query-нүүд Бүлэг 2, 8-д бичсэнтэй яг ижил — тэд одоо Python-ы текст дотор амьдарч байна. Үр дүнгийн мөр бүрийн баганыг row.title гэх мэт нэрээр нь дуудаж болно — SQLAlchemy мөр бүрийг баганын нэртэй объект болгон өгдөг. Кирилл нэрс зөв хэвлэгдсэн нь Python ба PostgreSQL хоёулаа UTF-8-аар ярьж байгааг харуулна — Бүлэг 10-ын кодын хуудасны асуудал энд гарахгүй.
Жишээ 2: SQLModel-ийн engine
FastAPI сургалтад та SQLModel-ээс create_engine импортлодог байсан. Тэр нь SQLAlchemy-ийн create_engine-тэй яг ижил функц — SQLModel түүнийг дахин экспортолдог. Тиймээс таны хуучин кодонд шилжилт ганц мөрийн өөрчлөлт:
python
# Өмнө (FastAPI сургалт)
engine = create_engine("sqlite:///library.db")
# Одоо
engine = create_engine(os.environ["DATABASE_URL"])Энэ хоёр мөр юу гэж хэлж байна вэ гэвэл: "өмнө нь engine library.db файл руу заадаг байсан; одоо орчны хувьсагчид бичигдсэн PostgreSQL server руу заана." SQLModel-ийн бусад бүх код — Session, select(), session.add() — өөрчлөлтгүйгээр ажиллана, учир нь тэд engine-ээр дамжуулан ярьдаг бөгөөд engine нь хаашаа ярихаа URL-аас мэддэг. Бүлэг 1-ийн “SQLModel бол орчуулагч” зүйрлэлийн хүч энд илэрч байна: орчуулагч шинэ хэлтэй (PostgreSQL-ийн аялгуу) хүнтэй ярих болсон ч таны түүнд өгөх заавар өөрчлөгдөөгүй. Түвшин 5-ын төгсгөлийн төсөлд бид Номын сангийн API-г яг ингэж шилжүүлнэ.
Жишээ 3: engine холболтыг хойшлуулдаг
Python-оос холбогдохын нэг онцлог зан: create_engine нь server-тэй огт холбогддоггүй. Тэр зөвхөн "хэрэгтэй үед энэ URL-аар холбогдоно" гэсэн бэлтгэл хийдэг. Нотлохын тулд нууц үгийг санаатайгаар буруу болгоё:
powershell
$env:DATABASE_URL = "postgresql+psycopg://postgres:wrong@localhost:5432/library"connect_test.py-д engine = create_engine(...) мөрийн дараа print("Engine бэлэн") нэмээд ажиллуулбал “Engine бэлэн” хэвлэгдэнэ — нууц үг буруу ч алдаа гараагүй. Алдаа зөвхөн engine.connect() мөрөнд гарна. Энэ нь бодит програмд чухал: FastAPI програм эхлэхэд engine үүсдэг ч анхны хүсэлт ирэх хүртэл server руу холбогддоггүй. Тиймээс нууц үг буруу програм амжилттай "асаж" магадгүй бөгөөд алдаа нь эхний хэрэглэгч сайт руу орох үед л илэрнэ. Энэ сургалтын төгсгөлийн төсөлд програм эхлэхэд холболтыг шууд шалгах аргыг харна. Туршилтын дараа $env:DATABASE_URL-ийг зөв нууц үгтэйгээр дахин тогтоогоорой.
Бүлэг 10-т psql-ийн холболтын алдааг уншсан. Python-д ижил алдаанууд гарна, гэхдээ traceback-ийн дотор, гурван давхарга бүхий мессеж хэлбэрээр. Тэдгээрийг дарааллаар нь харъя.
Драйвер суугаагүй. Хэрэв pip install-д psycopg-ийг мартсан бол:
ModuleNotFoundError: No module named 'psycopg'Энэ мессеж юу гэж хэлж байна вэ гэвэл: “psycopg гэдэг модуль олдсонгүй.” URL-д +psycopg гэж бичсэн тул SQLAlchemy тэр зөөгчийг дуудах гэсэн, гэвч суугаагүй байна. Шийдэл: виртуал орчин идэвхтэй эсэхийг шалгаад pip install "psycopg[binary]". Энэ алдаа create_engine мөрөнд гарна — драйверийг engine үүсгэхэд л ачаалдаг.
Орчны хувьсагч тогтоогоогүй. Шинэ PowerShell цонхонд $env:DATABASE_URL тогтоолгүйгээр ажиллуулбал:
KeyError: 'DATABASE_URL'Энэ мессеж юу гэж хэлж байна вэ гэвэл: “os.environ-д DATABASE_URL гэсэн түлхүүр алга.” Энэ бол PostgreSQL-ийн биш, Python-ы dict-ийн танил алдаа. Шийдэл: Алхам 3-ын мөрийг энэ цонхонд дахин ажиллуул.
Нууц үг буруу. Жишээ 3-ын тохиргоогоор engine.connect() хүрэхэд traceback-ийн төгсгөлд:
sqlalchemy.exc.OperationalError: (psycopg.OperationalError) connection failed: connection to server at "::1", port 5432 failed: FATAL: password authentication failed for user "postgres"Энэ мессежийг гаднаас нь дотогш нь гурван давхаргаар уншина. Гадна давхарга sqlalchemy.exc.OperationalError — “SQLAlchemy-ийн түвшинд үйл ажиллагааны алдаа гарлаа.” Хаалт доторх (psycopg.OperationalError) — "тэр алдааг үнэндээ psycopg драйвер илрүүлсэн." Төгсгөлийн хэсэг — server-ийн өөрийн үг, Бүлэг 10-т psql-ээс уншсан мессежтэй яг ижил: “postgres хэрэглэгчийн нууц үгийн баталгаажуулалт бүтэлгүйтлээ.” Python-ы traceback урт байж болох ч хамгийн хэрэгтэй мэдээлэл үргэлж сүүлийн мөрийн FATAL-ийн араас ирдэг. Шийдэл: URL дахь нууц үгийг шалгаарай.
Server ажиллахгүй. services.msc-д PostgreSQL service-ийг Stop хийгээд ажиллуулбал:
sqlalchemy.exc.OperationalError: (psycopg.OperationalError) connection failed: connection to server at "::1", port 5432 failed: Connection refused (0x0000274D/10061)
Is the server running on that host and accepting TCP/IP connections?Энэ мессеж юу гэж хэлж байна вэ гэвэл: “::1 хаягийн 5432 портод холбогдох оролдлого татгалзагдлаа; server тэр хаяг дээр ажиллаж, холболт хүлээн авч байна уу?” Хаалтанд байгаа тоо нь Windows-ийн дотоод алдааны код — үл тоомсорлож болно. Хоёр дахь мөрийн асуулт бол драйверийн өгсөн зөвлөмж бөгөөд бараг үргэлж зөв: server унтарсан. Шийдэл: service-ийг Start хий.
Өгөгдлийн сан байхгүй. URL-ийн төгсгөлд /librray гэж үсгийн алдаатай бичвэл:
sqlalchemy.exc.OperationalError: (psycopg.OperationalError) connection failed: connection to server at "::1", port 5432 failed: FATAL: database "librray" does not existУтга нь “librray гэдэг өгөгдлийн сан байхгүй.” Бүлэг 10-ын psql-ийн мессежтэй ижил, гэхдээ хоёр давхарга нэмэгдсэн.
Эдгээр бүх алдааг нэг дүрмээр уншина: traceback-ийг доороос нь, сүүлийн мөрөөс эхэлж унш; давхаргуудыг гаднаас нь дотогш нь задал; server-ийн үгийг FATAL эсвэл “Connection refused”-ээс ол; тэр үгийг URL-ийн аль хэсэгтэй холбоотойг тодорхойл. Server → хэрэглэгч → нууц үг → өгөгдлийн сан гэсэн шалгах дараалал Бүлэг 10-тай яг ижил хэвээр.
Хэрэв сонирхож байвал Жишээ 1-ийн кодыг өргөтгөж, Түвшин 3-ын удирдамжтай дасгалын тайлангуудаас нэгийг — жишээ нь гишүүдийн идэвхийн ангилал — Python-оос ажиллуулж, үр дүнг гишүүн бүрээр хэвлэж үзээрэй. SQL-ийг гурван давхар хашилтаар ("""...""") олон мөрт текст болгон бичвэл уншихад хялбар. Мөн URL-ийн хэсэг бүрийг (хэрэглэгч, порт, өгөгдлийн сан) нэг нэгээр нь санаатайгаар буруу болгож, гарах алдааны мессежийг URL-ийн хэсэгтэй тааруулж уншаарай. Эдгээр нь зөвхөн санал бөгөөд дараагийн хичээлүүд тэдгээрийг хийсэн гэж тооцохгүй.
Холболтын үндсэн алдаануудыг дээрх хэсэгт нарийвчлан уншсан. Энд бусад түгээмэл алдааг харъя.
Драйвергүй URL. postgresql://postgres:... гэж +psycopg-гүйгээр бичвэл SQLAlchemy анхдагч драйверийг хайна. Тэр нь таны суулгасан драйвераас өөр байвал ModuleNotFoundError: No module named 'psycopg2' гэх мэт, таны огт суулгаагүй модулийн нэртэй алдаа гарна. Энэ нь төөрөгдүүлэх тул драйверийг URL-д үргэлж ил тод бич.
Нууц үгийг кодонд бичих. Алдааны мессеж огт өгдөггүй ч хамгийн аюултай нь. Нууц үгтэй URL-тай Python файл Git-д commit хийгдвэл тэр нууц үг түүхэнд үүрд үлддэг — дараа нь файлаас устгасан ч. Орчны хувьсагч эсвэл .gitignore-д нэмсэн .env файл ашигла.
Виртуал орчин идэвхгүй. Шинэ PowerShell цонхонд .venv\Scripts\Activate.ps1-ийг мартвал Python өөр орчны сангуудыг хайж, ModuleNotFoundError: No module named 'sqlalchemy' гэх мэт алдаа гарна. Урилгын өмнө (.venv) байгаа эсэхийг шалга. Мөн PowerShell скрипт ажиллуулахыг хориглосон бол "Хөгжүүлэгчийн хэрэгсэл" сургалтын Execution Policy тохиргоог санаарай.
text()-ийг мартах. connection.execute("SELECT version()") гэж энгийн текст өгвөл SQLAlchemy 2-т алдаа гарна: sqlalchemy.exc.ObjectNotExecutableError: Not an executable object: 'SELECT version()'. Энэ мессеж юу гэж хэлж байна вэ гэвэл: "энэ бол ажиллуулж болох объект биш." SQLAlchemy 2 нь энгийн текстийг санаатайгаар хүлээн авдаггүй — дараагийн хичээлд яагаад гэдгийг SQL injection-ий тухай ярихдаа ойлгоно. SQL текстийг үргэлж text()-д ороо.
SQLite-ийн функцуудыг query-д үлдээх. Түвшин 3-ын тайлангуудыг Python-д хуулахдаа group_concat, julianday-г мартвал Бүлэг 10-ын function ... does not exist алдаа энд sqlalchemy.exc.ProgrammingError: (psycopg.errors.UndefinedFunction) function group_concat(text) does not exist хэлбэрээр гарна. Сүүлийн хэсэг нь танил — server-ийн үг.
Энэ хичээлд та Python-оос PostgreSQL-тэй холбогдлоо. SQLAlchemy SQL бичдэг, psycopg драйвер түүнийг сүлжээгээр server руу зөөдөг — SQLite-аас ялгаатай нь драйверийг тусад нь (pip install "psycopg[binary]") суулгана. Холболтын URL postgresql+psycopg://хэрэглэгч:нууц_үг@хаяг:порт/өгөгдлийн_сан хэлбэртэй бөгөөд хэсэг бүр нь psql-ийн холболтын алдаануудын нэгтэй харгалзана; драйверийг үргэлж ил тод нэрлэнэ. URL-ийг нууц үгтэй нь кодонд биш, орчны хувьсагчид хадгалж os.environ-оор уншина. engine.connect(), text(), .scalar() ба мөрөөр давталтаар query ажиллуулж, echo гаралтаас SQLAlchemy-ийн далд query-нүүд болон BEGIN, ROLLBACK-ийг харлаа. SQLModel-ийн engine нь ганц URL өөрчлөлтөөр PostgreSQL руу шилждэг. create_engine холболтыг хойшлуулдаг тул алдаа анхны холболтод гардаг; Python-ы холболтын алдааг доороос дээш, гаднаас дотогш уншиж, server-ийн үгийг ол.
Дараагийн хичээлд бид Python-оос query-д утга дамжуулах аргыг сурна: "энэ гишүүний зээлүүд" гэх мэт, хэрэглэгчээс ирсэн утгыг SQL-д хэрхэн оруулах вэ? Хамгийн байгалийн санагдах арга — текстийг залгах — нь вэб програмын хамгийн алдартай аюулын нэг болох SQL injection-ийн хаалгыг нээдэг. Бид үүнийг өөрийн туршилтын өгөгдлийн сан дээр, хариуцлагатайгаар харуулж, параметрүүд яагаад тэр хаалгыг бүрмөсөн хаадгийг ойлгоно.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.