db_migrate.py Neu
Dieses Skript migriert das Schema des database Plugins (Tabellen item/log) zwischen
zwei beliebigen der unterstützten Datenbank-Backends: SQLite3, MySQL/MariaDB und
PostgreSQL+TimescaleDB - in beliebiger Richtung.
Achtung
Das Skript muss bei gestopptem SmartHomeNG ausgeführt werden. Es verweigert den Start, solange eine laufende Instanz erkannt wird.
Quelle und Ziel können auf drei Arten angegeben werden: über den Namen einer bereits in
etc/plugin.yaml konfigurierten Plugin-Instanz (--source-instance/--dest-instance),
über explizite Treiber-/Verbindungsparameter (--source-driver/--source-connect bzw.
--dest-driver/--dest-connect), oder interaktiv über Rückfragen (--interactive).
Der Migrationslauf ist fortsetzbar: bereits auf dem Ziel vorhandene Items werden übersprungen,
sofern nicht --force für dieses Item angegeben wird. Mit --dry-run lässt sich der
geplante Ablauf ohne tatsächliche Schreibvorgänge prüfen.
Bemerkung
Stammt die Quelle von einer PostgreSQL+TimescaleDB-Instanz mit aktivierter
timescale_native_aggregation, verweigert das Skript standardmäßig die Migration: Es
liest ausschließlich die Rohdaten-Tabelle log, nicht die serverseitig berechneten
Continuous Aggregates - bereits durch timescale_native_retention entfernte Rohdaten
würden sonst stillschweigend fehlen. Mit --force <item ...> lässt sich dies bewusst
übergehen (migriert dann nur die noch vorhandenen Rohdaten).
smarthome@<yourcomputer>:/usr/local/smarthome$ python3 tools/db_migrate.py -h
usage: db_migrate.py [-h] [--etc-dir ETC_DIR] [--interactive] [--dry-run]
[--bulk] [--batch-size BATCH_SIZE]
[--force ITEM [ITEM ...]] [--source-instance NAME]
[--source-driver SOURCE_DRIVER] [--source-connect JSON]
[--source-password SOURCE_PASSWORD]
[--source-prefix SOURCE_PREFIX] [--dest-instance NAME]
[--dest-driver DEST_DRIVER] [--dest-connect JSON]
[--dest-password DEST_PASSWORD]
[--dest-prefix DEST_PREFIX]
Migrate the database plugin schema (item/log tables) between sqlite3/MySQL-
MariaDB/PostgreSQL. Must be run with SmartHomeNG stopped.
options:
-h, --help show this help message and exit
--etc-dir ETC_DIR etc/ directory to read plugin.yaml from
--interactive prompt for any side not fully specified via flags
--dry-run report what would happen, write nothing
--bulk use multi-row bulk inserts instead of row-by-row
(default)
--batch-size BATCH_SIZE
rows per commit (default 20000)
--force ITEM [ITEM ...]
redo these items even if already migrated; also the
required override to proceed when the source has
native continuous aggregates (see
source_has_native_cagg)
--source-instance NAME
source: plugin.yaml instance name
--source-driver SOURCE_DRIVER
source: driver (sqlite3/pymysql/psycopg2), manual
config
--source-connect JSON
source: connect params as a JSON object
--source-password SOURCE_PASSWORD
source: password (prompted via getpass if omitted and
needed)
--source-prefix SOURCE_PREFIX
source: table prefix
--dest-instance NAME destination: plugin.yaml instance name
--dest-driver DEST_DRIVER
destination: driver (sqlite3/pymysql/psycopg2), manual
config
--dest-connect JSON destination: connect params as a JSON object
--dest-password DEST_PASSWORD
destination: password (prompted via getpass if omitted
and needed)
--dest-prefix DEST_PREFIX
destination: table prefix
Beispiel: Migration einer lokalen SQLite3-Instanz nach PostgreSQL+TimescaleDB, unter
Verwendung zweier bereits in etc/plugin.yaml konfigurierter Instanzen:
python3 tools/db_migrate.py --source-instance database --dest-instance database_timescale