For a local database, run the official container image (the Docker Official Image for PostgreSQL, or Microsoft's SQL Server image, which defaults to the free Developer edition), and use Testcontainers to start throwaway databases from your test code. For migrations, pick Flyway if you want plain numbered SQL files, Liquibase if you need rollback in the free edition, Atlas if you prefer declaring the desired schema, or the tool that ships with your ORM. For data access in TypeScript, choose between Prisma, Drizzle ORM and TypeORM; in Python, SQLAlchemy with Alembic. In CI, lint SQL with SQLFluff, check PostgreSQL migrations with Squawk, and add Bytebase if changes need review and approval. For a SQL client, see the best SQL IDEs; DBeaver Community is the free cross-engine default.
A SQL editor is only one part of working with a database as a developer. The rest of the job happens in code and in the pipeline: getting a database running on your machine and in CI, changing the schema in a controlled and repeatable way, querying it from the application, catching risky SQL before it is merged, and filling it with realistic data for tests.
This guide covers those jobs, with the tools most often used for each. If you are looking for a desktop client to write and run queries, that is a different decision, covered in the best SQL IDEs and the best database management tools. If you need to compare two schemas or two sets of data, see the best database comparison tools.
Quick picks
Open source libraries for Java, Go, .NET, Node.js, Python and more that start a real database container per test run and remove it afterwards.
Numbered SQL files applied in order, with a free Community edition and an Apache 2.0 engine.
Rollback by tag, count and date is in the free Community edition.
Tables defined in TypeScript and a SQL-like query builder, Apache-2.0 licensed.
MIT-licensed linter and fixer for 28+ dialects, including T-SQL, PostgreSQL, MySQL and Snowflake, with dbt support.
How we chose
We split the developer workflow into six jobs: local and test databases (Docker images, Testcontainers), migrations (Flyway, Liquibase, Atlas, Alembic), ORMs and query builders (Prisma, Drizzle ORM, TypeORM, SQLAlchemy), linting, review and CI (SQLFluff, Squawk, Bytebase), test data (Faker; paid generators and masking tools are covered in the Redgate alternatives guide) and one SQL client.
To be included, a tool had to be actively released in 2026, document its licence and supported languages or databases on an official page or repository, and be usable by an individual developer without a sales call. Snaplet, once a common choice for seeding and subsetting, is not included because we could not confirm a currently maintained product. migra, a PostgreSQL schema diff tool, is officially deprecated by its author.
The order is not a ranking: entries follow the workflow, from running a database to filling it with data. Several tools in the same job are genuine alternatives; the entry text says when to choose which.
At a glance
| Tool | Job | Price | Licence | Languages / engines | Main trade-off |
|---|---|---|---|---|---|
| Docker database images | Local database | Free | Per image (PostgreSQL Licence; SQL Server Developer edition EULA) | PostgreSQL 14 to 18 (19 beta); SQL Server 2025 | Needs Docker; not a production setup |
| Testcontainers | Test databases | Free | MIT (Java library) | Java, Go, .NET, Node.js, Python, Rust and more | Needs a Docker-compatible runtime in CI |
| Flyway | Migrations | Free Community; paid Enterprise | Apache 2.0 engine | 50+ databases | No undo in the free edition |
| Liquibase | Migrations | Free Community; paid Secure | FSL-1.1-ALv2 from 5.0 | 65+ databases | Non-OSI licence; more concepts |
| Atlas | Migrations (declarative) | Free Starter; paid Pro | Apache 2.0 Community Edition | Community: MySQL, MariaDB, PostgreSQL, SQLite | Linting and some engines paid |
| SQLAlchemy and Alembic | ORM and migrations (Python) | Free | MIT | Python; many databases | Python only |
| Prisma ORM | ORM (TypeScript) | Free | Apache 2.0 | PostgreSQL, MySQL, MariaDB, SQL Server, SQLite, CockroachDB (7.x) | Major-version transition under way |
| Drizzle ORM | ORM and query builder (TypeScript) | Free | Apache-2.0 | PostgreSQL, MySQL, SQLite, SingleStore (0.45) | 1.0 still a release candidate |
| TypeORM | ORM (TypeScript) | Free | MIT | PostgreSQL, MySQL, SQL Server, Oracle, MongoDB and more | Decorator setup; breaking 1.0 |
| SQLFluff | SQL linting | Free | MIT | 28+ SQL dialects | Style rules need agreeing and tuning |
| Squawk | Migration linting | Free | Apache-2.0 or MIT | PostgreSQL | PostgreSQL only |
| Bytebase | Change review and CI | Free Community; paid Pro and Enterprise | MIT, with enterprise-licensed parts | PostgreSQL, MySQL, SQL Server, Oracle and more | A server to run |
| Faker | Test data | Free | MIT | Python | You write the seeding code |
| DBeaver Community | SQL client | Free (paid PRO editions) | Apache 2.0 | Many relational databases | NoSQL and compare features paid |
Docker database images
Job: local database. Running the database in a container keeps the engine version on your laptop and in CI the same as production and leaves nothing installed on the host. The postgres image on Docker Hub is a Docker Official Image maintained by the PostgreSQL Docker Community; on 7 October 2026 it documented tags for PostgreSQL 14 to 18 and 19 beta. It requires the POSTGRES_PASSWORD variable, and on first start it runs any *.sql files and *.sh scripts placed in /docker-entrypoint-initdb.d, which is a simple way to load a schema and seed data.
For SQL Server, Microsoft publishes Linux container images at mcr.microsoft.com/mssql/server (for example the 2025-latest tag). Microsoft's quickstart requires ACCEPT_EULA=Y and an SA password, and creates a container with the free Developer edition by default; production editions are configured differently. See SQL Server Express vs Developer for what the Developer licence allows.
- Needs Docker or a compatible container runtime, which some corporate machines restrict.
- The Developer edition of SQL Server is licensed for development and testing, not production.
- Data is lost with the container unless you mount a volume.
Testcontainers
Job: test databases. Testcontainers describes itself as "an open source library for providing throwaway, lightweight instances of databases, message brokers, web browsers, or just about anything that can run in a Docker container." Your test code declares the container it needs; the library starts it, gives you the connection details and removes it when the tests finish. The project lists implementations for more than 12 languages, including Java, Go, .NET, Node.js, Python, Rust, Ruby and PHP, and more than 50 modules, including PostgreSQL, MySQL, MongoDB, Redis and Cassandra. The Java library is MIT licensed.
It suits teams who have been bitten by differences between an in-memory test database and the real engine, for example SQL dialect, collation or locking behaviour. Combine it with your migration tool so every test run starts from a schema built the same way as production.
- CI runners need Docker or a compatible runtime, which some hosted runners and locked-down agents do not provide.
- Starting containers adds time to a test run compared with mocks (editorial).
- Each language implementation is a separate project, so module coverage differs by language.
Flyway
Job: migrations. Flyway, from Redgate, applies versioned SQL files such as V1__init.sql and V2__add_orders.sql in order and records them in a schema history table. Repeatable migrations, and the core migrate, info, validate, repair and baseline commands, are in the free editions. The open source engine is Apache 2.0 licensed (Flyway Engine 13.9.0 was current on 7 October 2026); Flyway Community adds proprietary components and Flyway Desktop, and Redgate positions it for individual developers and education.
Undo migrations, dry runs, drift detection and policy checks are documented as paid features in Flyway Enterprise. See Flyway vs Liquibase and Flyway vs Alembic.
- No undo command in the free editions; you write forward fixes instead.
- Enterprise prices are not published.
- SQL migrations are engine-specific, so supporting several engines means several scripts (editorial).
Liquibase
Job: migrations. Liquibase applies changesets from a changelog written in SQL, XML, YAML or JSON, and lists support for more than 65 databases. Its free Community edition includes rollback to a tag, by count and by date, and diff and diff-changelog commands that compare two databases. Liquibase Community 5.0.4 was current on 7 October 2026.
Since version 5.0, Community is licensed under FSL-1.1-ALv2, a source-available licence under which each release becomes Apache 2.0 after two years; the 4.x line stays Apache 2.0. The paid product is Liquibase Secure. See Flyway vs Liquibase and Liquibase vs Alembic.
- FSL-1.1-ALv2 is not an OSI-approved open source licence; check it with whoever approves licences.
- More concepts (changesets, contexts, labels, preconditions) than Flyway.
- Some diff object types, such as stored procedures, functions and triggers, need Liquibase Secure.
Atlas
Job: migrations. Atlas, from Ariga, works declaratively: you describe the schema you want (in SQL, HCL or from an ORM) and atlas schema diff or schema apply plans the statements to get there. It can also manage versioned migration directories. The Apache 2.0 Atlas Community Edition supports MySQL, MariaDB, PostgreSQL and SQLite; the standard binary adds SQL Server, Oracle, ClickHouse and others under Ariga's terms.
The free Community diff covers schemas, tables, indexes and constraints; views, functions, procedures, triggers and sequences, migration linting and drift detection are Pro features. As listed on Atlas's pricing page on 7 October 2026, Pro starts at USD 9 per developer per month, with usage-based charges for CI/CD projects and monitored databases.
- Migration linting in CI is a paid feature.
- SQL Server and Oracle are not in the Apache 2.0 Community Edition.
- Declarative planning still needs review for renames and data-preserving changes (editorial).
SQLAlchemy and Alembic
Job: data access and migrations (Python). SQLAlchemy is an MIT-licensed SQL toolkit and ORM; version 2.1.3 was released on 2 October 2026 and supports Python 3.11 to 3.15. You can use its Core layer to build SQL expressions or its ORM to map classes to tables. Alembic (1.20.0, MIT) is the migration tool from the same authors: each revision is a Python file with upgrade() and downgrade() functions, and --autogenerate compares your SQLAlchemy models with the database to draft a revision.
For a Python service this pair is usually the default. See Liquibase vs Alembic and Flyway vs Alembic for when a separate migration tool fits better.
- Python only; other services in other languages cannot share the migrations.
- Autogenerated revisions are drafts; Alembic's documentation says they must be reviewed.
- SQLAlchemy 2.x changed many patterns from 1.x, so older tutorials can mislead (editorial).
Prisma ORM
Job: data access (TypeScript). Prisma ORM is Apache 2.0 licensed. You describe models in the Prisma Schema Language, generate a type-safe client (findMany, include, nested writes) and manage changes with Prisma Migrate, which writes a SQL file per migration. Prisma Studio is the bundled data browser.
On 7 October 2026 the stable line was Prisma 7.10.0, supporting PostgreSQL, MySQL, MariaDB, SQL Server, SQLite and CockroachDB; Prisma 8 was a release candidate (npm's latest tag pointed to 8.0.0-rc.20) that targets PostgreSQL first. Check which line you install. See Prisma vs Drizzle ORM and Prisma vs TypeORM.
- No automatic down migrations; Prisma documents a manual workflow with <code>migrate diff</code>.
- Database coverage differs between Prisma 7 and the Prisma 8 release candidate.
- A separate schema language to learn alongside SQL and TypeScript.
Drizzle ORM
Job: data access (TypeScript). Drizzle ORM is Apache-2.0 licensed and has zero dependencies. Tables are declared in TypeScript (pgTable, mysqlTable, sqliteTable), and you query them with a SQL-like builder or a relational query API. The companion CLI, Drizzle Kit, generates and applies migrations and includes Drizzle Studio.
The stable release on 7 October 2026 was 0.45.3 (PostgreSQL, MySQL, SQLite, SingleStore); version 1.0 was in release candidate and adds SQL Server and CockroachDB. See Prisma vs Drizzle ORM.
- No down or rollback command in Drizzle Kit's command list.
- The documentation covers the 1.0 line while the stable release is 0.45.
- Assumes you know SQL well (editorial).
TypeORM
Job: data access (TypeScript). TypeORM is MIT licensed. Entities are classes with decorators such as @Entity and @Column, used in Active Record or Data Mapper (repository) style. Migrations are TypeScript classes with up and down methods, and migration:revert runs the down of the last one. It supports PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, Oracle, CockroachDB, SAP HANA, Google Spanner and MongoDB.
TypeORM 1.0 was released on 19 May 2026 after a long 0.3.x series; npm's latest tag was 1.1.1 on 7 October 2026. See Prisma vs TypeORM.
- Needs <code>experimentalDecorators</code>, <code>emitDecoratorMetadata</code> and <code>reflect-metadata</code>.
- 1.0 removed many deprecated APIs, so older tutorials may not match.
SQLFluff
Job: SQL linting in CI. SQLFluff describes itself as "a dialect-flexible and configurable SQL linter". It reports and can fix most layout and convention issues, supports more than 28 dialects including ANSI, T-SQL, PostgreSQL, MySQL, MariaDB, Oracle, Snowflake, BigQuery, Databricks and DuckDB, and handles templated SQL through Jinja and a dbt templater. It is MIT licensed; version 4.4.0 was released on 2 October 2026 and added GitLab Code Quality output for merge requests.
- Checks style and some anti-patterns, not whether a migration is safe to run on a busy table.
- Teams need to agree a rule set and tune it, or the output gets ignored (editorial).
Squawk
Job: migration linting. Squawk is a linter for PostgreSQL migrations and SQL that aims to "prevent unexpected downtime caused by database migrations and encourage best practices around Postgres schemas and SQL". It runs against migration files, can comment on GitHub pull requests through its GitHub Action, and is dual-licensed under Apache-2.0 and MIT.
It complements SQLFluff: SQLFluff checks how SQL is written, Squawk checks what a migration will do to a running database. Atlas offers similar migration linting for several engines on its paid plans.
- PostgreSQL only.
- A rule-based linter: it flags known risky patterns but cannot see your table sizes or traffic (editorial).
Bytebase
Job: change review and CI. Bytebase is a web-based database change management platform: developers submit changes, SQL review rules check them, reviewers approve them and Bytebase deploys them, with GitOps integration for GitHub and GitLab. Its repository lists PostgreSQL, MySQL, SQL Server, Oracle, MongoDB, Redis, MariaDB, TiDB, Snowflake, ClickHouse and others. The code is MIT licensed except for directories under a separate enterprise licence.
As listed on Bytebase's pricing page on 7 October 2026, Community is free for up to 20 users and 10 database instances, Pro is USD 20 per user per month, and Enterprise is by quote.
- A server application to run and maintain, not a CLI you drop into a pipeline.
- Community limits of 20 users and 10 instances.
- More process than a small team usually needs (editorial).
Faker
Job: test data. Faker is an MIT-licensed Python package that "generates fake data for you": names, addresses, emails, dates, text and many other providers, in many locales, with seeding for reproducible output and a faker fixture for pytest. Similar libraries exist in other ecosystems. You write a small script that inserts the generated rows, or feed them to your ORM's seed command.
If you need masked and subsetted copies of production rather than synthetic rows, that is a different, usually paid, category; see the test data section of the Redgate alternatives guide.
- You write and maintain the seeding code and keep it consistent with foreign keys.
- Synthetic data does not reproduce the skew and edge cases of real production data (editorial).
DBeaver Community
Job: SQL client. You still need somewhere to run ad hoc queries and inspect data. DBeaver Community 26.2.2 is Apache 2.0 licensed, connects to a long list of relational databases, and includes ER diagrams in read-only form and a Simple Structure Compare. NoSQL engines, full schema and data compare and Git integration need a paid edition.
If you live in an editor instead, the VS Code MSSQL and PostgreSQL extensions from Microsoft are free; if you want deeper refactoring, DataGrip is free for non-commercial use. All the options are compared in the best SQL IDEs and DBeaver vs DataGrip.
- Java-based; the vendor documents memory settings for large result sets.
- NoSQL drivers and full schema compare are in paid editions.
How to choose
Start from the language and framework you already use. Python services usually take SQLAlchemy and Alembic; TypeScript services choose between Prisma, Drizzle ORM and TypeORM, and use the ORM's own migrations unless several applications share the database. When several services, languages or teams share one database, a stand-alone migration tool (Flyway, Liquibase or Atlas) keeps the schema history in one place.
Then add safety in layers, cheapest first: the same container image locally and in CI, Testcontainers for integration tests, SQLFluff and (for PostgreSQL) Squawk in pull requests, and Bytebase or a paid migration edition only when you need approvals, drift detection or an audit trail. Keep the SQL client choice separate; it matters less than the pipeline around it.
Frequently asked questions
What database tools does a developer need besides a SQL editor?
Usually a way to run the database locally and in tests (container images, Testcontainers), a migration tool (Flyway, Liquibase, Atlas or your ORM's own), an ORM or query builder, a SQL linter in CI (SQLFluff, Squawk) and a way to generate test data (for example Faker).
Should I use my ORM's migrations or a separate tool?
If one application owns the database, the ORM's migrations (Prisma Migrate, Drizzle Kit, TypeORM migrations, Alembic) keep everything in one codebase. If several applications or languages share the database, a stand-alone tool such as Flyway or Liquibase is easier to share. See Flyway vs Liquibase.
Which free migration tool supports rollback?
Liquibase Community includes rollback by tag, count and date. Alembic and TypeORM run the downgrade or down code you write. Flyway documents undo as a paid feature, and Drizzle Kit has no rollback command.
Is Testcontainers free?
Yes. The Testcontainers libraries are open source (the Java library is MIT licensed). You need a Docker-compatible container runtime where the tests run.
Prisma, Drizzle or TypeORM?
Prisma for a generated, high-level client and integrated tooling; Drizzle for SQL-like queries in plain TypeScript; TypeORM for decorated classes and the widest database list, including Oracle. See Prisma vs Drizzle ORM and Prisma vs TypeORM.
Is migra still maintained?
No. Its GitHub repository says the project is officially deprecated and points to a successor project; the last release was in September 2022. For PostgreSQL schema comparison see the best database comparison tools.
Sources
- PostgreSQL Docker Official Image
- Run SQL Server Linux containers with Docker (Microsoft Learn)
- Testcontainers
- Testcontainers for Java repository (MIT licence)
- Redgate Flyway editions
- Liquibase
- Liquibase diff command documentation
- Atlas pricing
- Atlas schema diff documentation
- SQLAlchemy on PyPI
- Alembic documentation
- Prisma ORM repository
- Drizzle ORM documentation
- TypeORM repository
- SQLFluff repository and releases
- Squawk repository
- Bytebase pricing
- Faker repository
- migra repository (deprecation notice)
- DBeaver editions
Checked October 2026.
How we research these guides: our editorial method.