From 884f26bf25adced664efceafe9524539241b5abf Mon Sep 17 00:00:00 2001 From: orejudo Date: Sat, 4 Jul 2026 00:13:10 +0200 Subject: [PATCH] Migrate existing employees.name to first_name/last_name in-place MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bestehende Deployments mit dem alten name-Feld verlieren beim Redeploy keine Daten mehr: db.js erkennt das alte Schema (PRAGMA table_info), splittet name in first_name/last_name und übernimmt alle Zeilen, statt die Tabelle neu anzulegen. Läuft nur einmal (Spalte "name" existiert danach nicht mehr) und lässt neue Datenbanken unverändert. --- server/db.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/server/db.js b/server/db.js index 2367685..002e4f5 100644 --- a/server/db.js +++ b/server/db.js @@ -14,10 +14,33 @@ db.pragma('foreign_keys = ON'); const schema = fs.readFileSync(path.join(__dirname, 'schema.sql'), 'utf8'); db.exec(schema); +migrateEmployeeName(); + if (isNew) { seed(); } +// Ältere Deployments hatten ein einzelnes "name"-Feld statt first_name/last_name. +// Bestehende Daten werden erhalten, indem der Name gesplittet statt die Tabelle neu angelegt wird. +function migrateEmployeeName() { + const columns = db.prepare('PRAGMA table_info(employees)').all().map((c) => c.name); + if (!columns.includes('name') || columns.includes('first_name')) return; + + db.exec('ALTER TABLE employees ADD COLUMN first_name TEXT'); + db.exec('ALTER TABLE employees ADD COLUMN last_name TEXT'); + + const rows = db.prepare('SELECT id, name FROM employees').all(); + const update = db.prepare('UPDATE employees SET first_name = ?, last_name = ? WHERE id = ?'); + for (const row of rows) { + const parts = (row.name || '').trim().split(/\s+/); + const first_name = parts.shift() || ''; + const last_name = parts.join(' '); + update.run(first_name, last_name, row.id); + } + + db.exec('ALTER TABLE employees DROP COLUMN name'); +} + function seed() { const insertEmployee = db.prepare( 'INSERT INTO employees (first_name, last_name, email, role, weekly_capacity_hours) VALUES (?, ?, ?, ?, ?)'