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');
|
const schema = fs.readFileSync(path.join(__dirname, 'schema.sql'), 'utf8');
|
||||||
db.exec(schema);
|
db.exec(schema);
|
||||||
|
|
||||||
|
migrateEmployeeName();
|
||||||
|
|
||||||
if (isNew) {
|
if (isNew) {
|
||||||
seed();
|
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() {
|
function seed() {
|
||||||
const insertEmployee = db.prepare(
|
const insertEmployee = db.prepare(
|
||||||
'INSERT INTO employees (first_name, last_name, email, role, weekly_capacity_hours) VALUES (?, ?, ?, ?, ?)'
|
'INSERT INTO employees (first_name, last_name, email, role, weekly_capacity_hours) VALUES (?, ?, ?, ?, ?)'
|
||||||
|
|||||||
Reference in New Issue
Block a user