Migrate existing employees.name to first_name/last_name in-place

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.
This commit is contained in:
2026-07-04 00:13:10 +02:00
parent 60dd58d31f
commit 884f26bf25
+23
View File
@@ -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 (?, ?, ?, ?, ?)'