mirror of
https://github.com/maziggy/bambuddy.git
synced 2026-09-30 19:21:33 +02:00
On a PostgreSQL install, create_backup_zip() exports a portable SQLite copy so backups move between engines. It rebuilt each table with only column name + type + PK, dropping NOT NULL, server_default/DEFAULT, foreign keys, and unique constraints. Restore onto SQLite page-copies that schema straight onto the live database, and post-restore init_db() can't repair it (create_all is CREATE TABLE IF NOT EXISTS). So server_default columns like spoolbuddy_devices.created_at (server_default=func.now()) ended up with no DEFAULT: SQLAlchemy omits them on INSERT, the DB wrote NULL, and the next read 500'd on Pydantic validation. Every server_default column was exposed the same way; the FK/unique loss followed from the same simplified CREATE TABLE. Build the portable schema with Base.metadata.create_all() against a SQLite engine instead of the hand-rolled loop, so it emits the exact DDL a native SQLite install gets (NOT NULL, DEFAULT func.now() -> CURRENT_TIMESTAMP, FKs, unique constraints, indexes). The data-export insert path is unchanged, and the #1333 OIDC-icon guard is preserved automatically (LargeBinary -> BLOB), which lets the now-redundant _sqlalchemy_type_to_sqlite_type() helper be removed. Fixes newly-created backups; a backup from an older build still carries the degraded schema, so re-take backups after upgrading. Replace the #1333 type-mapping unit tests with three that inspect the real backup schema via metadata.create_all + PRAGMA table_info: icon_data is BLOB, created_at keeps its CURRENT_TIMESTAMP DEFAULT, a NOT NULL non-PK column stays NOT NULL.