Free while in early access

Database diagrams, drawn by running your migrations

Upload the migration files of Flyway, Liquibase, Prisma, Django or 18 other tools. SchemaDrawer runs them for real, in Docker, against the exact PostgreSQL, MySQL, MariaDB, SQL Server, Oracle or SQLite version you deploy to, and returns an SVG of the schema they produce.

22 migration tools 6 engines, 23 versions SVG in seconds GitHub Action included
schema-diagram.svg · PostgreSQL 18 · Flyway
ER diagram drawn by SchemaDrawer from three Flyway migrations: owners, pets, types, vets, specialties, vet_specialties and visits, with primary keys, foreign keys and column types
In two minutes

Watch the idea, start to finish

Three migration files go in. A real database starts, the real tool runs them, the schema is read back and laid out. One SVG comes out, ready for your README, wiki or pull request.

Read how it works

The video is on its wayA two-minute walkthrough of the idea lands here soon. Until then, read how it works.
How it works

Three steps, no parser in sight

SchemaDrawer never guesses what your SQL means. It asks the database.

1

Upload the migration directory

One multipart request with your files, the tool, the engine and its version. The answer is a job id; a repeated request with the same Request-Id is never drawn twice.

2

The real tool runs on a real engine

A throw-away PostgreSQL, MySQL, MariaDB, SQL Server, Oracle or SQLite of the version you named starts in Docker. Flyway, Prisma, Django or whichever tool you use applies your files to it.

3

The schema is read back and drawn

Tables, columns, types, primary and foreign keys come straight from the engine's metadata, get laid out by a graph layout engine and are rendered as a crisp SVG. The link stays valid for an hour.

bash
$ curl -X POST https://schemadrawer.com/api/v1/drawing \
    -H "Request-Id: $(uuidgen)" -F "userId=5f0c1d2e-..." \
    -F "migrationType=FLYWAY" -F "databaseType=POSTGRESQL" -F "version=18" \
    -F "files=@db/migration/V1__create_owners_and_pets.sql" \
    -F "files=@db/migration/V2__create_vets.sql" \
    -F "files=@db/migration/V3__create_visits.sql"
{"jobId":"0b6e2f4c-8d1a-4c3e-9f7a-2a5b6c7d8e9f"}

$ curl https://schemadrawer.com/api/v1/drawing/0b6e2f4c-8d1a-4c3e-9f7a-2a5b6c7d8e9f
{"status":"SUCCESS","diagramUrl":"https://.../diagram.svg"}  # 6 seconds later
Why run instead of parse

A migration is defined by what the tool does with it

Static parsers and model diffs approximate your schema. Running the migration on the engine you deploy to shows the schema you will actually get.

SituationParse the SQLDiff the ORM modelsRun the migrations SchemaDrawer
Migrations written in code (Django, EF Core, Rails, Knex, Alembic)Nothing to parseShows the model, not what was migratedThe tool executes them
Dialect-specific DDL and vendor typesOne grammar per dialect, always behindDepends on the ORM's mappingThe engine decides
Procedural blocks, conditional SQL, DO blocksSkipped or misreadInvisibleExecuted like everything else
Renames, drops and alterations across many filesNeeds a simulatorOnly the end state, if in syncApplied in order, end state read back
Differences between engine versionsOne grammar fits allIgnoredPick the version, PostgreSQL 10 to 18
A broken migrationBest-effort errorNot detectedThe tool's own error message
Supported migration tools

22 tools, every ecosystem

Each tool runs in its own container image, in its real version. Pick yours to see what to upload.

Go and language-independentgolang-migrate goose dbmate Atlas Sqitch
RustDiesel

All tools and the support matrix

Supported databases

6 engines in 23 versions

Draw on the version you actually deploy to. Every combination of tool and engine is part of SchemaDrawer's own test suite.

PostgreSQL

22 tools

10 11 12 13 14 15 16 17 18

MySQL

22 tools

8.0 8.4 9

MariaDB

22 tools

10.6 11.4 11.8 12

Microsoft SQL Server

17 tools

2017 2019 2022 2025

Oracle Database

11 tools

21 23

SQLite

17 tools

latest
GitHub Action

A diagram that updates itself

Add one step to a workflow. On every change to your migrations the action uploads them, waits for the diagram and opens a pull request with the new SVG. Identical output, no pull request.

  • Runs on ubuntu-latest with nothing to install
  • Fails the job with the migration tool's message when a migration is broken
  • Retries are safe: a run attempt is never drawn twice
Action reference
name: Update schema diagram

on:
  push:
    branches: [main]
    paths: ['db/migration/**']
  workflow_dispatch:

permissions:
  contents: write
  pull-requests: write

jobs:
  draw:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: schemadrawercom/action@v1
        with:
          sql-directory: db/migration
          output-path: docs/schema-diagram.svg
          migration-type: FLYWAY
          database-type: POSTGRESQL
          database-version: '18'
          github-token: ${{ secrets.GITHUB_TOKEN }}
Example

Thirteen tables, one request

An e-commerce schema in four Flyway migrations, drawn on PostgreSQL 18. Types are the ones PostgreSQL reports; arrows carry the foreign-key column.

ecommerce · PostgreSQL 18 · Flyway
ER diagram of an e-commerce schema with 13 tables: customers, addresses, categories, products, product_categories, inventory, orders, order_items, payments, shipments, coupons, order_coupons and reviews

More examples: the same schema in ten tools and on six engines

Pricing

Free today. Enterprise when you need it.

No account, no card, no limits beyond the size of an upload. Enterprise plans for teams that need self-hosting, SSO and guarantees are on the way.

Coming soon

Enterprise

Let's talk

For teams with compliance, scale and support needs.

  • Self-hosted or private cloud
  • SSO, audit log, retention controls
  • Priority queue and SLA
  • Bigger uploads, longer timeouts, support
Join the waiting list
FAQ

Questions, answered

Everything else is in the docs, or an email away.

No. Every drawing starts a fresh, empty database container of the engine and version you name, runs your migrations in it, reads the schema back and destroys the container. Nothing connects to your systems.

The migration directory exactly as your tool keeps it: Flyway's SQL scripts, Liquibase's changelog tree, Prisma's migrations folder, Django's app directories, EF Core's Migrations folder and so on. Each tool page describes the expected layout.

Every table the migrations create, with its columns and their type names, primary keys in bold, foreign keys marked FK and drawn as labelled arrows between tables. The migration tool's own history table is left out. Views, indexes, check constraints, defaults, comments and data are not drawn.

Usually a few seconds once the images are warm: the PetClinic sample on PostgreSQL 18 took about six seconds end to end in our runs, most of it database start-up. SQL Server and Oracle take longer to start, and the first drawing with a rarely used tool can take longer still. A drawing is stopped after 120 seconds.

The job ends with status ERROR and the migration tool's own output, exit code included, so you see the same message you would see on your machine.

Not yet. SchemaDrawer is an HTTP API with a GitHub Action on top; the Swagger UI at schemadrawer.com/swagger-ui.html lets you try a drawing from the browser.

Yes, everything is free today, with uploads of up to 100 MB and 2000 files per drawing. Enterprise plans with self-hosting, SSO, SLAs and bigger limits are planned; any change to the free offer will be announced well ahead of time.

Yes. The API is plain HTTP with multipart uploads, so curl, any CI system and any language work. The GitHub Action is a bash script around the same two calls.
From the blog

Migrations, diagrams and databases

Practical writing on schema design, migration tools and keeping documentation honest.

All articles

Draw your schema in the next five minutes

One HTTP call with your migration files, one poll, one SVG. Free while we build it.