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:
@@ -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 (?, ?, ?, ?, ?)'
|
||||
|
||||
Reference in New Issue
Block a user