Lightweight Postgres Schema Versioning
Project description
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.
Usage
-
Write a sequence of incremental postgres SQL data definition scripts
- initial schema creation
create_000.sqlCREATE TABLE AcmeData(aid SERIAL PRIMARY KEY, data TEXT UNIQUE NOT NULL);
- first schema upgrade
create_001.sqlCREATE 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.sqlINSERT INTO AcmeType(atype) VALUES ('wow'), ('incredible');
- initial schema creation
-
Generate a
psql-script from these for the target application:pg-schema-version -a acme create_*.sql > acme.sql
-
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):initjust initialize an empty psv infrastructure if needed.registerregister new application in the psv infrastructure if needed.runapply required steps on an already registered application.createdo all of the above.removedrop psv infrastructure.helpshow some help.
- available moistures are (default is
dry):drymeaning that no changes are applied.wetto 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.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pg_schema_version-0.1.tar.gz.
File metadata
- Download URL: pg_schema_version-0.1.tar.gz
- Upload date:
- Size: 12.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9067f3746add8f4ca2e1a5e45fdb946397df3a11e3a5cca2fb6c04a001279858
|
|
| MD5 |
ba44098e53c258d445f40dc06683da4e
|
|
| BLAKE2b-256 |
a6c5c14544a454e70396fae5d93e05b1bf430bf332a4902762963882f45a267d
|
File details
Details for the file pg_schema_version-0.1-py3-none-any.whl.
File metadata
- Download URL: pg_schema_version-0.1-py3-none-any.whl
- Upload date:
- Size: 8.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1873e45e54741cf83994e69004f40977830ac7d0c62db7b2551034aa764d3ac1
|
|
| MD5 |
56319c050d2bfca193c3498a1c6eefab
|
|
| BLAKE2b-256 |
d27092b9f778267fc129d169b27f3e4b52ad644aac0687fe1e45c35fa2e9fd30
|