Vienas tiesos šaltinis — Postgres, goose, sqlc
Pradinis puslapis neturi ką tikro pasakyti — jo būsenos kortelė įrašyta kietai. Metas prijungti duomenų bazę. Iki pamokos pabaigos Home rodys gyvą registruotų vartotojų skaičių, nuskaitytą iš Postgres.
Trys įrankiai, trys darbai:
- PostgreSQL — duomenų bazė.
- goose — migracijos. Kiekvienas schemos pokytis — sunumeruotas
.sqlfailas (00001_users.sql). goose pritaiko laukiančius iš eilės ir įsimena, kurie jau įvykdyti. Mes juos įterpiam ir paleidžiam paleidimo metu, tad šviežias diegimas migruoja pats save. - sqlc — užklausos. Rašai paprastą SQL; sqlc iš jo sugeneruoja tipiškai saugias Go funkcijas. Jokio ORM, jokios užklausų DSL — tik SQL, o kompiliatorius tikrina Go pusę.
Gražioji dalis — vienas tiesos šaltinis. Štai faktas, ties kuriuo verta sustoti:
sqlc skaito savo schemą tiesiai iš goose migracijų failų. Pažiūrėk į
sqlc.yaml:schema: "db/migrations". sqlc neturi savo lentelių aprašų kopijos — jis skaito tuos pačius.sqlfailus, kuriuos goose pritaiko tikrai duomenų bazei. Tad generuotas Go negali prasilenkti su tikra schema.
Jei naudojai tipišką ORM, žinai įprastą tvarką: migracijos aprašo bazę, o atskirai modelio klasės aprašo, kaip kodas mano bazę atrodant — ir tie du tyliai išsiskiria. Pridedi stulpelį migracijoje, pamiršti atnaujinti modelį, ir niekas nesiskundžia iki vykdymo. Visa ta klaidų kategorija čia negali egzistuoti, nes yra tik vienas schemos aprašas. Keiti migraciją → generuoji iš naujo → Go tipai pasikeičia atitikti, kompiliavimo metu. Pervadinai stulpelį ir pamiršai atnaujinti užklausą? sqlc generate nepavyksta. Prasilenkimas pagaunamas dar prieš kodui susikompiliuojant.
Tai įrodysi namų darbe: pridėsi stulpelį migracijai, sugeneruosi iš naujo ir stebėsi, kaip generuotas Go užsiaugina lauką be jokių rankinių pataisų.
Ši pamoka stato duomenų sluoksnį:
userslentelę (goose migracija) + migracijų įterpimą.sqlc.yaml+ užklausą, sugeneruotą į Go.- pgx jungčių telkinį (pool).
- Sujungimą į
mainirHome— gyvą skaičių.
Būtina sąlyga — veikiantis Postgres. Reikia lokalaus Postgres.
createdb signflowir viskas; konfigūracijos numatytoji reikšmė jungiasi priepostgres://postgres@localhost:5432/signflow.Nėra administratoriaus teisių / Windows?
scoop install postgresqlįdiegia vartotojo lygio Postgres (be administratoriaus), tada paleisk supg_ctl -D "$env:USERPROFILE\scoop\apps\postgresql\current\data" start.