feat: add schema application to database initialization script

- Read and execute schema.sql file after database creation
- Handle idempotent schema application by ignoring duplicate object errors
- Maintain graceful error handling for non-critical schema conflicts
This commit is contained in:
Yusuf İpek
2025-11-11 18:26:11 +03:00
parent 263f19d065
commit 0b01191193
+31
View File
@@ -1,6 +1,8 @@
#!/usr/bin/env node
const { Pool } = require('pg')
const fs = require('fs')
const path = require('path')
const DB_HOST = process.env.DB_HOST || 'localhost'
const DB_PORT = parseInt(process.env.DB_PORT || '5432', 10)
@@ -33,9 +35,38 @@ async function main() {
} finally {
await admin.end().catch(() => {})
}
// Connect to the target DB and apply schema
const db = new Pool({
host: DB_HOST,
port: DB_PORT,
database: DB_NAME,
user: DB_USER,
password: DB_PASSWORD,
})
try {
const schemaPath = path.join(__dirname, '..', 'src', 'lib', 'database', 'schema.sql')
const schema = fs.readFileSync(schemaPath, 'utf8')
console.log('🔧 Applying schema...')
await db.query(schema)
console.log('✅ Schema applied')
} catch (err) {
// 42P07 duplicate_table, 42710 duplicate_object, 23505 unique_violation (for seed inserts)
const ignorable = new Set(['42P07', '42710', '23505'])
if (err && ignorable.has(err.code)) {
console.log('️ Schema objects already exist; skipping')
} else {
console.error('❌ Schema apply error:', err)
process.exitCode = 1
}
} finally {
await db.end().catch(() => {})
}
}
main().catch((e) => {
console.error('❌ init:db failed:', e)
process.exit(1)
})