DEV Community

Mohammad Waseem
Mohammad Waseem

Posted on

Streamlining Production Databases: A Lead QA Engineer’s Approach with TypeScript Under Tight Deadlines

Managing cluttered production databases can be a daunting task, especially when deadlines loom and the integrity of live systems must be maintained. As a Lead QA Engineer tasked with solving this challenge, adopting a strategic, code-driven approach using TypeScript proved pivotal. This post outlines the methodology, key implementation strategies, and best practices for tackling database clutter efficiently under pressure.

Context and Challenge

In high-pressure environments, production databases often accumulate redundant, obsolete, or inconsistent data—collectively referred to as "clutter"—which hampers performance, complicates data management, and increases the risk of faults during deployment. Traditional manual cleanup methods are time-consuming and error-prone, making automation and reliable scripting essential.

Why TypeScript?

TypeScript, with its static typing, rich ecosystem, and compile-time error detection, provides advantage over plain JavaScript. Its ability to catch issues early in development reduces bugs and ensures safer manipulations of production data.

Approach Overview

The core of the solution involved building a robust automation tool that could identify, classify, and delete or archive unnecessary data systematically. The process involved several steps:

  1. Data Analysis & Identification: Using queries to find stale or redundant data.
  2. Safety Checks: Implementing validation layers to prevent accidental loss.
  3. Execution: Applying batch operations with transaction support.
  4. Logging & Monitoring: Ensuring transparency and rollback capabilities.

Implementation Details

Setup & Tools

import { createConnection, Connection } from 'typeorm';

const connection: Connection = await createConnection({
    type: 'postgres',
    host: 'db-host',
    port: 5432,
    username: 'admin',
    password: 'password',
    database: 'production_db',
    entities: [/* entities here */],
    synchronize: false,
});
Enter fullscreen mode Exit fullscreen mode

Safe Cleanup with TypeScript

async function cleanObsoleteRecords() {
    const queryRunner = connection.createQueryRunner();
    await queryRunner.startTransaction();

    try {
        // Identify obsolete data: example for logs older than 6 months
        const obsoleteLogs = await queryRunner.query(
            `SELECT id FROM logs WHERE created_at < NOW() - INTERVAL '6 months'`
        );

        const ids = obsoleteLogs.map((log: { id: number }) => log.id);
        if(ids.length > 0) {
            // Backup before delete
            await queryRunner.query(`INSERT INTO logs_archive SELECT * FROM logs WHERE id = ANY($1)`, [ids]);

            // Delete obsolete logs
            await queryRunner.query(`DELETE FROM logs WHERE id = ANY($1)`, [ids]);
        }

        await queryRunner.commitTransaction();
        console.log(`${ids.length} obsolete records archived and deleted.`);
    } catch (error) {
        await queryRunner.rollbackTransaction();
        console.error('Error during cleanup:', error);
    } finally {
        await queryRunner.release();
    }
}
Enter fullscreen mode Exit fullscreen mode

Considerations for Production

  • Testing: Always run scripts in a staging environment first.
  • Backups: Ensure recent backups are available before automated cleanup.
  • Logging: Implement detailed logs for audit and troubleshooting.
  • Incremental Execution: Break down the process into smaller batches to minimize load.

Final Thoughts

Automation with TypeScript empowers QA and development teams to perform cleanup operations swiftly and safely, even under tight schedules. Proper safeguards, thorough testing, and incremental approaches are critical to prevent data loss and ensure system stability. By adopting a structured, code-centric method, teams can reduce database clutter significantly, optimize performance, and maintain cleaner production environments with confidence.

Deploying such solutions doesn’t just solve an immediate problem; it establishes a repeatable process that helps sustain a healthy, scalable database architecture over time.


🛠️ QA Tip

To test this safely without using real user data, I use TempoMail USA.

Top comments (0)