Skip to main content

Lightweight Postgres Schema Versioning

There already exists many tools to manage database schema versions, such as sqitch, or alembic. Please consider them first to check whether they fit your needs before considering this one. In contrast to these tools, pg-schema-version emphasizes a simple approach based on a single plain SQL scripts and no configuration, to provide limited but useful features with safety in mind. The application schema status is maintained in one table to detect reruns. Several application can share the same setup.

Tests Python Version Badges License

Usage

  1. Write a sequence of incremental postgres SQL data definition scripts

    • initial schema creation create_000.sql
      CREATE TABLE AcmeData(aid SERIAL PRIMARY KEY, data TEXT UNIQUE NOT NULL);
      
    • first schema upgrade create_001.sql
      CREATE TABLE AcmeType(atid SERIAL PRIMARY KEY, atype TEXT UNIQUE NOT NULL);
      INSERT INTO AcmeType(atype) VALUES ('great'), ('super');
      ALTER TABLE AcmeData ADD COLUMN atid INT NOT NULL DEFAULT 1 REFERENCES AcmeType;
      
    • second schema upgrade create_002.sql
      INSERT INTO AcmeType(atype) VALUES ('wow'), ('incredible');
      
  2. Generate a psql-script from these for the target application:

    pg-schema-version -a acme create_*.sql > acme.sql
    
  3. Execute the script against a database to bring its schema up to date.

    # first time MUST use command create
    psql -v psv=create acme < acme.sql
    # psv command set to create
    # psv dry create for acme, enable with -v psv=create:wet
    # psv script will create infra, register acme and execute all steps
    
    psql -v psv=create:wet < acme.sql
    # psv wet run for acme
    # psv creating psv infra
    # psv registering app acme
    # psv applying acme 1
    # psv applying acme 2
    # psv applying acme 3
    # psv acme version: 3
    # psv wet run for acme done
    
    # on rerun, do nothing
    psql -v psv=wet < acme.sql
    # psv wet run for app acme
    # psv skipping acme 1
    # psv skipping acme 2
    # psv skipping acme 3
    # psv acme version: 3
    # psv wet run for acme done
    

Features

The python script generates a reasonably safe re-entrant idempotent SQL script driven by psql-variable psv with value command:moist

  • available commands are (default is run):
    • init just initialize an empty psv infrastructure if needed.
    • register register new application in the psv infrastructure if needed.
    • run apply required steps on an already registered application.
    • create do all of the above.
    • remove drop psv infrastructure.
    • help show some help.
  • available moistures are (default is dry):
    • dry meaning that no changes are applied.
    • wet to trigger actual changes.

The only way is forward: there is no provision to go back to a previous state. However, note that schema steps are performed in a transaction, so that it can only fail one full step at a time.

Caveats

There is no magic involved, you can still shot yourself in the foot, although with an effort.

To be safe, SQL schema creation scripts must NOT:

  • include backslash commands which may interfere with the script owns.
  • include SQL transaction commands.

Imperfect checks are performed to detect the above issues. They can be circumvented with option --trust-scripts.

Test your scripts with care before applying it to production data.

Versions

0.1 on 2024-10-14

  • initial beta version for testing

License

This code is Public Domain.

All software has bug, this is software, hence… Beware that you may lose your hairs or your friends because of it. If you like it, feel free to send a postcard to the author.

Metadata

Release files for pg-schema-version 0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pg-schema-version 0.1
File Size Uploaded
pg_schema_version-0.1.tar.gz 12.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pg-schema-version 0.1
File Interpreter ABI Platform
pg_schema_version-0.1-py3-none-any.whl Python 3 none any Details

Total release size: 20.9 kB

Release files / pg_schema_version-0.1.tar.gz

Download URL pg_schema_version-0.1.tar.gz
Size 12.3 kB
Tags Source
SHA-256 checksum
How to use checksums
9067f3746add8f4ca2e1a5e45fdb946397df3a11e3a5cca2fb6c04a001279858
BLAKE2b-256 checksum
How to use checksums
a6c5c14544a454e70396fae5d93e05b1bf430bf332a4902762963882f45a267d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.1 CPython/3.12.3

Release files / pg_schema_version-0.1-py3-none-any.whl

Download URL pg_schema_version-0.1-py3-none-any.whl
Size 8.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1873e45e54741cf83994e69004f40977830ac7d0c62db7b2551034aa764d3ac1
BLAKE2b-256 checksum
How to use checksums
d27092b9f778267fc129d169b27f3e4b52ad644aac0687fe1e45c35fa2e9fd30
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.1 CPython/3.12.3

Release history Release notifications | RSS feed

1.0

2 release files

0.6

2 release files

0.5

2 release files

0.4

2 release files

0.3

2 release files

0.2

2 release files

This release

0.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page