datapipeline 3.1.0: SQLite schreibt im Streaming in Paketen, Lizenz BSD-3-Clause
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# DataPipeline – ETL-Framework in Ruby
|
||||
|
||||
Stand: 2026-10-09 · Gem `datapipeline` 3.0.0 ([CHANGELOG.md](CHANGELOG.md)) · Ruby 3.4
|
||||
Stand: 2026-10-09 · Gem `datapipeline` 3.1.0 ([CHANGELOG.md](CHANGELOG.md)) · Ruby 3.4 · Lizenz BSD-3-Clause ([LICENSE](LICENSE))
|
||||
|
||||
`DataPipeline` liest Daten aus einer Quelle, schickt jede Zeile durch eine Kette von Schritten (prüfen, filtern,
|
||||
umbauen, anreichern, abgleichen) und schreibt das Ergebnis in ein oder mehrere Ziele. Eine Pipeline ist ein kurzes
|
||||
@@ -15,7 +15,7 @@ Festbreiten-Dateien und REST-APIs.
|
||||
4. [Plugins](#4-plugins) – mitgelieferte Quellen und Ziele, eigene Plugins, Abhängigkeiten
|
||||
5. [Satzarten-Layouts](#5-satzarten-layouts) – Dateien mit Kopf-, Positions- und Schlusssätzen
|
||||
6. [Betrieb](#6-betrieb) – Kommandozeile, Verbindungen, Sperre, Abgleich, Historie, Benachrichtigung, Fehlersuche
|
||||
7. [Umstieg](#7-umstieg) – von 2.x auf 3.0 (`transform` entfernt), von 2.0 auf 2.1
|
||||
7. [Umstieg](#7-umstieg) – auf 3.1, von 2.x auf 3.0 (`transform` entfernt), von 2.0 auf 2.1
|
||||
8. [Entwicklung](#8-entwicklung) – Aufbau, Tests, Gem bauen
|
||||
9. [Ausblick](#9-ausblick)
|
||||
|
||||
@@ -54,10 +54,13 @@ In einer anderen Anwendung:
|
||||
|
||||
```ruby
|
||||
# Gemfile
|
||||
gem 'datapipeline', path: '../datapipeline' # oder git: '…'
|
||||
gem 'datapipeline', '~> 3.1', git: 'https://git.wicom.li/wkh/datapipeline.git', branch: 'main'
|
||||
gem 'pg' # nur die Gems der benötigten Plugins (4.10)
|
||||
```
|
||||
|
||||
`'~> 3.1'` verhindert, dass `bundle update` unbemerkt eine neue Hauptversion mit Breaking Changes holt (8.3). Für die
|
||||
Entwicklung gegen einen lokalen Checkout: `bundle config set local.datapipeline ../datapipeline`.
|
||||
|
||||
```sh
|
||||
bundle install
|
||||
bundle exec etl pipeline.rb --dry-run # das Kommando etl kommt mit dem Gem
|
||||
@@ -826,7 +829,7 @@ Unterschieden:
|
||||
| `header` | kennt `read` und `written` | wird zuerst geschrieben, `read` und `written` sind `nil` |
|
||||
| `ctx.read` in `map`/`filter` | Anzahl Quellzeilen | `nil` |
|
||||
| `reconcile` | vor dem Schreiben | nach der letzten Zeile; die Zeilen sind schon geschrieben |
|
||||
| Postgres als Ziel | eine Transaktion für alles | eine Transaktion je `batch_size` Zeilen, mit `batch_size: :all` eine für alles (4.2) |
|
||||
| Postgres, SQLite als Ziel | eine Transaktion für alles | eine Transaktion je `batch_size` Zeilen, mit `batch_size: :all` eine für alles (4.2, 4.3) |
|
||||
| Postgres als Quelle | eine Abfrage | serverseitiger Cursor, je `fetch_size` Zeilen |
|
||||
|
||||
`limit n` beendet im Streaming das Lesen nach n Zeilen.
|
||||
@@ -1013,9 +1016,13 @@ write container(:sqlite, database: 'tmp/kunden.sqlite3', table: 'kunden', create
|
||||
| `create: true` | Tabelle beim ersten Schreiben aus der ersten Zeile anlegen (Integer → `integer`, Float → `real`, sonst `text`) |
|
||||
| `truncate: true` | Tabelle vor dem ersten Schreiben leeren |
|
||||
| `upsert: %w[belnr]` | wie bei Postgres; mit `create: true` wird der nötige Unique-Index mit angelegt |
|
||||
| `batch_size` | Streaming: Zeilen je Transaktion (Default 1000) oder `:all` |
|
||||
|
||||
Werte kommen mit SQLite-Typen zurück (Integer, Float, String, `nil`); `Date` und `Time` werden als ISO-Text
|
||||
geschrieben. `write` schreibt in einer Transaktion.
|
||||
geschrieben. `write` schreibt in einer Transaktion. Im Streaming gilt dasselbe wie bei Postgres (4.2): `write_row`
|
||||
schreibt je `batch_size` Zeilen in einer Transaktion, `finalize` und `close` den Rest; mit `batch_size: :all` ist der
|
||||
ganze Stream eine Transaktion, die nach einem Abbruch zurückgerollt wird. Eine Abfrage (`query`, `lookup`) auf
|
||||
demselben Storage schreibt noch gesammelte Zeilen vorher, sie sieht also alles, was schon übergeben wurde.
|
||||
|
||||
### 4.4 CSV
|
||||
|
||||
@@ -1516,6 +1523,12 @@ schnellen Blick auf das Ergebnis.
|
||||
|
||||
## 7. Umstieg
|
||||
|
||||
### 7.0 Von 3.0 auf 3.1
|
||||
|
||||
3.1 ist abwärtskompatibel. Anders als in 3.0: SQLite schreibt im Streaming (`write_row`) nicht mehr jede Zeile
|
||||
einzeln, sondern je 1000 Zeilen in einer Transaktion (4.3). Wer während eines Laufs mit einer zweiten Verbindung
|
||||
auf die Zieldatei schaut, sieht die Zeilen also paketweise. Das Gem steht jetzt unter der BSD-3-Clause-Lizenz.
|
||||
|
||||
### 7.1 Von 2.x auf 3.0
|
||||
|
||||
3.0 entfernt das alte Ausführungsmodell: `transform`, den Parallelmodus, `chained` und `condition:` als String
|
||||
@@ -1607,9 +1620,13 @@ Ein eigenes Plugin lässt sich mit `MemoryStorage` aus `test/test_helper.rb` als
|
||||
|
||||
- Version in [lib/datapipeline/version.rb](lib/datapipeline/version.rb), Änderungen in [CHANGELOG.md](CHANGELOG.md)
|
||||
(neueste oben). Neue Funktionen erhöhen die mittlere Stelle, Breaking Changes die erste (wie 3.0, 7.1).
|
||||
- Jede Version bekommt ein Tag `vX.Y.Z` (`git tag -a v3.1.0 -m "datapipeline 3.1.0" && git push origin v3.1.0`).
|
||||
Anwendungen binden das Gem mit einer Versionsgrenze ein (`'~> 3.1'`, 1.2) oder fest auf ein Tag
|
||||
(`tag: 'v3.1.0'`; dann geht `local.datapipeline` nicht).
|
||||
- Das `Gemfile` bindet das Gem über `gemspec` ein und ergänzt die Gruppen `plugins` (`pg`, `sqlite3`, `roo`,
|
||||
`caxlsx`, `http`) und `test`; `Gemfile.lock` ist versioniert. Ohne Plugin-Gems: `bundle config set without plugins`.
|
||||
- Gem bauen: `gem build datapipeline.gemspec`.
|
||||
- Lizenz: BSD-3-Clause, siehe [LICENSE](LICENSE); die Datei ist Teil des Gems.
|
||||
- Beispiele in Kapitel 2 werden mit einem Marker `<!-- beispiel: examples/datei.rb -->` vor dem Codeblock eingebunden;
|
||||
der Doku-Test vergleicht Block und Datei, Änderungen also immer in beiden machen.
|
||||
|
||||
@@ -1623,8 +1640,6 @@ Offene Punkte, Reihenfolge = empfohlene Umsetzung:
|
||||
schreiben), `etl list` (Pipelines, Wasserzeichen, letzter Lauf aus der Historie), `--json` für die Stats.
|
||||
2. **Qualität:** CI auf git.wicom.li mit `rake test` und Postgres-Service, RuboCop, `DataPipeline::Testing` mit
|
||||
`MemoryStorage` als öffentliche Testhilfe für Anwendungen.
|
||||
3. **SQLite im Streaming:** `write_row` wie bei Postgres in Paketen schreiben.
|
||||
4. **Slack:** fertige Meldung aus den Stats (`notify slack, on: :problems`), Timeout und Wiederholung bei `429`,
|
||||
3. **Slack:** fertige Meldung aus den Stats (`notify slack, on: :problems`), Timeout und Wiederholung bei `429`,
|
||||
Maskierung von `&`, `<`, `>`, Incoming Webhooks.
|
||||
5. **Weitere Plugins:** SFTP-Ablage.
|
||||
6. **Veröffentlichung:** eigenes Remote-Repository, Lizenz festlegen, Versionen taggen.
|
||||
4. **Weitere Plugins:** SFTP-Ablage.
|
||||
|
||||
Reference in New Issue
Block a user