# Har bygget en databasedrevet CV‑generator

Har bygget en databasedrevet generator til CV, referencer, portefølje og ansøgninger i Python — 41 moduler, 10.580 linjer — der genererer seks outputformater fra én SQLite‑kilde med 23 tabeller, som en idempotent pipeline i 19 trin bygger op.

juli 2026

**Situation.** Et CV, et referenceark, en portefølje og en ansøgning er de samme fakta arrangeret på fire måder, og at holde dem som fire dokumenter betyder, at hver rettelse foretages fire gange og til sidst ikke bliver det. Tre sprog ganger det med tre. Fejltilstanden er ikke, at et dokument er forkert; den er, at to dokumenter er uenige, og at intet siger, hvilket af dem der er det gældende.

**Opgave.** Én kilde til fakta skulle frembringe hvert dokument, på hvert sprog, i hvert format, med arrangementet afgjort af kode og ikke af den, der sidst redigerede en fil.

**Handling.** Kilden er en SQLite‑database med treogtyve tabeller — achievements, titler, virksomheder, regioner, kategorier, ydelser, profiler, referencer, resuméer — samlet af en pipeline i nitten trin, der kører fra en tom fil til en komplet database med én kommando. Trinnene er ordnede, og hvert er skrevet til at være sikkert at gentage, så pipelinen kan køres mod en eksisterende database uden at duplikere en række. Enogfyrre Python‑moduler på i alt 10.580 linjer gengiver seks outputformater fra den: HTML, PDF i to varianter, ren tekst, Markdown og JSON, gennem seks Jinja‑skabeloner og otte stylesheets. Kørselsafhængighederne blev holdt nede på præcis to, en skabelonmotor og en PDF‑gengiver, ud fra det argument, at en dokumentgenerator, der ikke kan installeres om fem år, ikke har bevaret noget. Målretning er et førsteklasses begreb og ikke en manuel redigering: en profil vælger, hvilke achievements der optræder, og i hvilken rækkefølge, så et dokument rettet mod én slags læser er en databaseforespørgsel og ikke en kopi.

**Resultat.** Seks formater, tre sprog og fem temaer kommer ud af én database, og en rettet sætning rettes én gang. Prisen er, at systemet nu er den eneste måde at frembringe et dokument på — der er ikke længere en fil at åbne og redigere i en fart, og at tilføje et sprog betyder at tilføje det overalt, før noget som helst kan bygges.

---

- Rolle: Python‑udvikler
- Kategorier: [Løsningsarkitektur](https://engineer.company/da/categories/solution-architecture/), [Backend‑udvikling](https://engineer.company/da/categories/backend/), [Full stack‑udvikling](https://engineer.company/da/categories/full-stack/), [Databaser](https://engineer.company/da/categories/databases/), [SQL](https://engineer.company/da/categories/sql/), [Automatisering & CI/CD](https://engineer.company/da/categories/automation/), [Python](https://engineer.company/da/categories/python/), [Internationalisering](https://engineer.company/da/categories/i18n/)
- Ydelser: [Platform- & løsningsarkitektur](https://engineer.company/da/services/platform-architecture/), [Backend- & API‑udvikling](https://engineer.company/da/services/backend-development/), [Full stack‑produktudvikling](https://engineer.company/da/services/full-stack-development/), [Internationalisering & lokalisering](https://engineer.company/da/services/i18n-localization/), [Databasedesign & datamodellering](https://engineer.company/da/services/database-design/)

<https://engineer.company/da/portfolio/built-a-database-driven-cv-generator/>
