{"id":48443911,"url":"https://github.com/pt9912/d-migrate","last_synced_at":"2026-04-20T05:09:21.833Z","repository":{"id":349356618,"uuid":"1080360286","full_name":"pt9912/d-migrate","owner":"pt9912","description":"Framework für datenbankunabhängige Migrationen und Datenverwaltung","archived":false,"fork":false,"pushed_at":"2026-04-13T17:15:40.000Z","size":1709,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-13T18:27:59.593Z","etag":null,"topics":["database","migration"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pt9912.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-21T08:58:15.000Z","updated_at":"2026-04-13T17:53:30.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pt9912/d-migrate","commit_stats":null,"previous_names":["pt9912/d-migrate"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/pt9912/d-migrate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pt9912%2Fd-migrate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pt9912%2Fd-migrate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pt9912%2Fd-migrate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pt9912%2Fd-migrate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pt9912","download_url":"https://codeload.github.com/pt9912/d-migrate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pt9912%2Fd-migrate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32033760,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-20T00:18:06.643Z","status":"online","status_checked_at":"2026-04-20T02:00:06.527Z","response_time":94,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","migration"],"created_at":"2026-04-06T17:01:52.816Z","updated_at":"2026-04-20T05:09:21.826Z","avatar_url":"https://github.com/pt9912.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# d-migrate\n\n**Datenbankunabhängiges CLI-Tool für Schema-Migration und Datenmanagement.**\n\n\u003c!-- Badges --\u003e\n![Build](https://github.com/pt9912/d-migrate/actions/workflows/build.yml/badge.svg)\n![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)\n![Kotlin](https://img.shields.io/badge/Kotlin-2.1.20-purple.svg)\n\n---\n\n## Was ist d-migrate?\n\nd-migrate ist ein Kommandozeilenwerkzeug, mit dem du dein Datenbankschema einmalig in einem neutralen, datenbankunabhängigen Format (YAML) definierst und anschließend für mehrere Zielsysteme validierst, vergleichst und DDL erzeugst. Damit entfallen getrennte Migrationsskripte pro Datenbankengine.\n\n**Aktuelle Fähigkeiten:**\n- Phasenbezogene DDL-Ausgabe mit `--split pre-post` fuer importfreundliche Schema-Artefakte (pre-data/post-data)\n- Neutrales Schemamodell mit 18 integrierten Typen plus Spatial Geometry\n- YAML-basierte Schemadefinition und -parsing\n- Schemagültigkeitsprüfung mit 18+ Fehlercodes (E001-E018, E120/E121)\n- Schema-Vergleich mit `schema compare` (file/file, file/db, db/db)\n- Reverse-Engineering bestehender Datenbanken mit `schema reverse` (PostgreSQL, MySQL, SQLite)\n- DDL-Generierung für PostgreSQL, MySQL und SQLite\n- Spatial-DDL: PostGIS, MySQL native, SpatiaLite (`--spatial-profile`)\n- Transformation von View-Queries (17 SQL-Funktionen)\n- Transformationsberichte (YAML-Seitenschatten)\n- Streaming-Datenexport (JSON, YAML, CSV) mit benannten Verbindungen\n- Transaktionaler Datenimport mit UPSERT, Truncate, Trigger-Handling und Reseeding\n- Direkter DB-zu-DB-Datentransfer mit `data transfer`\n- Inkrementeller Export über `--since-column` / `--since` (LF-013)\n- Line-orientierte Fortschrittsanzeige für `data export`, `data import` und `data transfer`\n- CLI mit `schema validate`, `schema generate`, `schema compare`, `schema reverse`, `data export`, `data import`, `data transfer` und `data profile`\n- Internationalisierte CLI-Ausgabe (EN/DE) mit ResourceBundle-Fallback, ICU4J-Unicode-Utilities, expliziter Zeitzonen-/Temporal-Policy und konsolidiertem CSV-/BOM-Encoding-Vertrag\n- OCI-Image für die Nutzung mit Docker\n\n## Schnellstart\n\n### Voraussetzungen\n\n- **JDK 21** oder neuer — _oder_ Docker (siehe unten, kein lokales JDK erforderlich)\n\n### Installation\n\n#### GitHub Release Assets\n\nFür veröffentlichte Releases stehen ZIP, TAR und Fat JAR auf der\n[Releases-Seite](https://github.com/pt9912/d-migrate/releases) bereit.\n\n```bash\n# Launcher-basierte Distribution entpacken\ntar -xf d-migrate-\u003cversion\u003e.tar\n./d-migrate-\u003cversion\u003e/bin/d-migrate --help\n\n# Alternativ das Fat JAR direkt ausführen\njava -jar d-migrate-\u003cversion\u003e-all.jar --help\n```\n\nHinweis: Die Homebrew-Formula wird in 0.5.0 im Repository mitgeführt, ist aber\nnoch kein vollautomatischer Standard-Installationspfad.\n\n#### Aus Quellcode bauen\n\n```bash\n./gradlew build\n```\n\n#### Release-Assets lokal bauen\n\n```bash\n./gradlew :adapters:driving:cli:assembleReleaseAssets\nls -1 adapters/driving/cli/build/release\n```\n\n### CLI ausführen\n\n```bash\n# Schema validieren\n./gradlew :adapters:driving:cli:run --args=\"schema validate --source schema.yaml\"\n\n# Zwei Schemas vergleichen\n./gradlew :adapters:driving:cli:run --args=\"schema compare --source schema.yaml --target schema-new.yaml\"\n\n# PostgreSQL-DDL generieren\n./gradlew :adapters:driving:cli:run --args=\"schema generate --source schema.yaml --target postgresql\"\n\n# MySQL-DDL mit Rollback generieren\n./gradlew :adapters:driving:cli:run --args=\"schema generate --source schema.yaml --target mysql --generate-rollback\"\n\n# Schema aus bestehender Datenbank extrahieren\n./gradlew :adapters:driving:cli:run --args=\"schema reverse --source mydb --output reverse.yaml --report reverse.report.yaml\"\n\n# DB-basierter Schema-Vergleich\n./gradlew :adapters:driving:cli:run --args=\"schema compare --source file:schema.yaml --target db:mydb\"\n\n# DB-zu-DB Datentransfer\n./gradlew :adapters:driving:cli:run --args=\"data transfer --source sourcedb --target targetdb --tables users,orders\"\n```\n\n### Docker\n\n#### Veröffentlichtes Image nutzen\n\nKein lokales JDK erforderlich — einfach Image ziehen und ausführen:\n\n```bash\n# Validierung\ndocker run --rm -v $(pwd):/work ghcr.io/pt9912/d-migrate:latest schema validate --source /work/schema.yaml\n\n# Compare (file/file)\ndocker run --rm -v $(pwd):/work ghcr.io/pt9912/d-migrate:latest schema compare --source file:/work/schema.yaml --target file:/work/schema-new.yaml\n\n# DDL generieren\ndocker run --rm -v $(pwd):/work ghcr.io/pt9912/d-migrate:latest schema generate --source /work/schema.yaml --target postgresql\n\n# Reverse-Engineering\ndocker run --rm -v $(pwd):/work ghcr.io/pt9912/d-migrate:latest \\\n  --config /work/.d-migrate.yaml schema reverse --source mydb --output /work/reverse.yaml\n```\n\n#### Mit Dockerfile lokal bauen und testen\n\nDas Repository liefert ein Multi-Stage [`Dockerfile`](Dockerfile), das das Projekt im Container baut\nund testet und danach die CLI-Distribution in ein schlankes JRE-Laufzeitimage verpackt. Das ist der einfachste Weg,\nden vollständigen Build ohne lokale JDK-Installation auszuführen.\n\n```bash\n# Vollständiger Build inkl. Tests und Coverage-Validierung (Standard)\ndocker build -t d-migrate:dev .\n\n# Erzwungener vollständiger Test/Coverage-Lauf (Docker-Layer-Cache UND Gradle-Cache werden umgangen)\ndocker build --no-cache \\\n  --progress=plain \\\n  --build-arg GRADLE_TASKS=\"build :adapters:driving:cli:installDist --rerun-tasks\" \\\n  -t d-migrate:dev .\n\n# Aggregierten Kover-HTML-Report bauen und lokal im Browser ansehen\ndocker build --target coverage -t d-migrate:coverage .\ndocker run --rm -p 8080:8080 d-migrate:coverage\n# dann http://localhost:8080 im Browser öffnen\n\n# Aggregierten Kover-JSON-Report direkt auf stdout ausgeben\ndocker build --target coverage-json -t d-migrate:coverage-json .\ndocker run --rm d-migrate:coverage-json \u003e coverage.json\n\n# Optional den 90%-Kover-Gate wie in CI hart prüfen\ndocker build --target coverage-verify -t d-migrate:coverage-verify .\n\n# Tests überspringen — nur CLI-Distribution erstellen\ndocker build --build-arg GRADLE_TASKS=\"assemble :adapters:driving:cli:installDist\" \\\n  -t d-migrate:dev .\n\n# Nur einen Build-Stage-Teil ausführen, ohne finales Runtime-Image zu erzeugen\ndocker build --target build \\\n  --build-arg GRADLE_TASKS=\":hexagon:core:test :adapters:driven:driver-common:test\" \\\n  -t d-migrate:phase-a .\n\n# Lokal gebaute CLI ausführen\ndocker run --rm -v $(pwd):/work d-migrate:dev schema validate --source /work/schema.yaml\n\n# Testcontainers-basierte Integrationssuite ausführen\n./scripts/test-integration-docker.sh\n\n# Oder nur eine Teilmenge der Integrationstests ausführen\n./scripts/test-integration-docker.sh :adapters:driven:driver-postgresql:test\n```\n\nHinweise:\n\n- Die Build-Stage nutzt `eclipse-temurin:21-jdk-noble` und cached Gradle-Abhängigkeiten über BuildKit-Cache-Mounts, sodass wiederholte Builds schnell sind.\n- Die Runtime-Stage nutzt `eclipse-temurin:21-jre-noble` (dasselbe Basisimage wie das veröffentlichte OCI-Image aus `:adapters:driving:cli:jibDockerBuild`).\n- Die `coverage`-Stage führt `test koverHtmlReport koverXmlReport` aus und liefert den aggregierten Root-Kover-HTML-Report über einen eingebauten HTTP-Server auf Port `8080` aus.\n- Die `coverage-json`-Stage gibt denselben aggregierten Root-Kover-Report als JSON per `ENTRYPOINT` auf `stdout` aus, sodass du ihn direkt in eine Datei umleiten kannst.\n- Die `coverage`-Stage baut den HTML-Report bewusst auch dann, wenn der 90%-Kover-Gate aktuell unterschritten wird.\n- Die separate `coverage-verify`-Stage führt `koverVerify` aus und bricht `docker build --target coverage-verify` absichtlich mit einem Fehler ab, sobald der konfigurierte Kover-Mindestwert nicht erreicht wird.\n- Ein vollständiger `docker build` erreicht immer die Runtime-Stage. Wenn du `GRADLE_TASKS` überschreibst, füge `:adapters:driving:cli:installDist` hinzu; für Build-/Test-Only-Subsets nutze alternativ `--target build`.\n- Testcontainers-basierte Integrationstests sollten nicht in `docker build` laufen. Nutze dafür\n  [`scripts/test-integration-docker.sh`](scripts/test-integration-docker.sh),\n  das einen kurzlebigen JDK-Container startet und den Docker-Socket des Hosts mountet, damit Testcontainers PostgreSQL/MySQL normal starten kann.\n- Um Build-Artefakte aus der Build-Stage zu extrahieren:\n  ```bash\n  docker build --target build -t d-migrate:build .\n  docker create --name d-migrate-tmp d-migrate:build\n  docker cp d-migrate-tmp:/src/adapters/driving/cli/build/distributions ./dist\n  docker rm d-migrate-tmp\n  ```\n\n### Minimales Schema-Beispiel\n\nLege eine Datei namens `schema.yaml` an:\n\n```yaml\nschema_format: \"1.0\"\nname: \"My App\"\nversion: \"1.0.0\"\n\ntables:\n  users:\n    columns:\n      id:\n        type: identifier\n        auto_increment: true\n      email:\n        type: text\n        max_length: 254\n        required: true\n        unique: true\n      created_at:\n        type: datetime\n        default: current_timestamp\n    primary_key: [id]\n```\n\nDann validierst du es so:\n\n```bash\n./gradlew :adapters:driving:cli:run --args=\"schema validate --source schema.yaml\"\n```\n\nUnd vergleichst zwei Versionen so:\n\n```bash\n./gradlew :adapters:driving:cli:run --args=\"schema compare --source schema.yaml --target schema-v2.yaml\"\n```\n\n## Aktueller Stand\n\nAktuelles Release: **[v0.9.1](https://github.com/pt9912/d-migrate/releases/tag/v0.9.1)** — Beta: Library-Refactor und Integrationsschnitt — Sicherheits-Härtung (SQL-Identifier-Quoting), Zerlegung großer Orchestrierungs-/Dialekt-Klassen, Port-Split (`ports-common`/`ports-read`/`ports-write`), Profiling-Extraktion in optionale Module, deduplizierter FK-Topo-Sort.\n\nAlle Releases und Details: [CHANGELOG.md](CHANGELOG.md) | [GitHub Releases](https://github.com/pt9912/d-migrate/releases)\n\n## Unterstützte Datenbanken\n\n| Datenbank  | Status                                                              |\n| ---------- | ------------------------------------------------------------------- |\n| PostgreSQL | DDL-Generierung, Reverse-Engineering, Datenexport/-import/-transfer |\n| MySQL      | DDL-Generierung, Reverse-Engineering, Datenexport/-import/-transfer |\n| SQLite     | DDL-Generierung, Reverse-Engineering, Datenexport/-import/-transfer |\n| Oracle     | Geplant                                                             |\n| MSSQL      | Geplant                                                             |\n\n## Roadmap\n\nDie vollständige Roadmap und den Meilensteinplan findest du in\n[docs/roadmap.md](docs/roadmap.md).\n\n## Dokumentation\n\nDetaillierte Dokumentation findest du im [docs/](docs/)-Verzeichnis:\n\n- [Quick Start Guide (Deutsch)](docs/guide.md)\n- [Entwurf](docs/design.md) / [Architektur](docs/architecture.md)\n- [Schema-YAML-Referenz](docs/schema-reference.md)\n- [Spezifikation des neutralen Modells](docs/neutral-model-spec.md)\n- [CLI-Spezifikation](docs/cli-spec.md)\n- [Regeln zur DDL-Generierung](docs/ddl-generation-rules.md)\n- [Verbindungs- und Konfigurationsspezifikation](docs/connection-config-spec.md)\n- [Roadmap](docs/roadmap.md)\n- [Release-Leitfaden](docs/releasing.md)\n- [Lastenheft (Deutsch)](docs/lastenheft-d-migrate.md)\n\n## Mitmachen\n\nBeiträge sind willkommen! Bitte erstelle ein Issue oder einen Pull Request auf [GitHub](https://github.com/pt9912/d-migrate).\n\n1. Forke das Repository\n2. Erstelle einen Feature-Branch von `develop`\n3. Schreibe Tests für deine Änderungen\n4. Stelle sicher, dass alle Tests laufen (`./gradlew build`)\n5. Reiche einen Pull Request gegen `develop` ein\n\n## Lizenz\n\nDieses Projekt ist unter der [MIT-Lizenz](LICENSE) lizenziert.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpt9912%2Fd-migrate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpt9912%2Fd-migrate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpt9912%2Fd-migrate/lists"}