# Har genereret 495 achievement‑sider på tre sprog fra en skrivebeskyttet SQLite‑eksport, med sidens adresse forfattet som data, så en rettet sætning ikke længere flyttede siden og brød linket.

2025

**Situation.** Virksomhedens porteføljeindhold skrives i en særskilt database — den samme der frembringer CV'et — og websitet skal udgive det som sider, på tre sprog, uden at de to kopier driver fra hinanden. Den naive tilgang, at skrive siderne i hånden og holde dem i takt, fejler ved den første rettelse.

**Opgave.** Websitet skulle generere sit indhold fra databasen som et byggeinput, med sideadresser der overlever, at sætningerne på dem bliver skrevet om.

**Handling.** En eksportør læser databasen skrivebeskyttet og skriver én side per achievement per sprog — 495 sider — plus de taksonomi- og ydelsesdata skabelonerne har brug for. Den bruger kun standardbiblioteket, så sitets bygning ikke afhænger af generatorens miljø, og det committede output betyder, at sitet bygger selvstændigt. Den mest konsekvensrige beslutning i den handler om adresser. Sitet plejede at udlede en sides URL fra de indledende ord i dens engelske udsagn, så at rette en sætning flyttede tavst siden og ødelagde hvert link til den — et site hvis argument for sig selv er, at det retter ting, og som opkrævede sig selv et dødt link, hver gang det gjorde. Adressen skrives nu som data: én række per adresse per achievement, den første er den aktuelle, og hver senere er en pensioneret adresse, sitet udsender som en omdirigering. To andre fælder er noteret fra det samme arbejde. En periodesammenligning mod en tekstkolonne matchede tavst alle toogtredive rækker på grund af, hvordan databasen tildeler typeaffinitet på tværs af en sammenligning. Og sproglisten er nu den ene akse, som skriveløkken, datafilerne og forespørgslerne alle udledes af, så at tilføje et fjerde sprog er én opslagspost frem for en søgning.

**Resultat.** Tre hundrede og enogtyve sider genereres fra én kilde, at rette et udsagn koster intet, og de adresser dette site nogensinde har udgivet, svarer fortsat. Eksportøren ejer også præcis én præsentationsbeslutning — hvordan ydelser grupperes i tematiske afsnit — og det er bevidst: alt andet den skriver, tilhører databasen, og en gruppeoverskrift der mangler et sprog, fejler eksporten frem for at gengive engelsk oven på oversat indhold.

---

- Rolle: Test- og kvalitetsingeniør
- Kategorier: [Frontend‑udvikling](https://engineer.company/da/categories/frontend/), [Webudvikling](https://engineer.company/da/categories/web-development/), [Databaser](https://engineer.company/da/categories/databases/), [SQL](https://engineer.company/da/categories/sql/), [Datapipelines (ETL/ELT)](https://engineer.company/da/categories/data-pipelines/), [Python](https://engineer.company/da/categories/python/), [Internationalisering](https://engineer.company/da/categories/i18n/)
- Ydelser: [Webstedsudvikling & CMS](https://engineer.company/da/services/web-development/), [Internationalisering & lokalisering](https://engineer.company/da/services/i18n-localization/), [Udvikling af datapipelines (ETL/ELT)](https://engineer.company/da/services/data-pipeline-development/), [Brand, marketing & SEO](https://engineer.company/da/services/brand-marketing/)

<https://engineer.company/da/portfolio/generated-321-achievement-pages-from-a-sqlite-export-132/>
