Skip to main content

PostgreSQL migrations, sweetly done ๐Ÿ“

Project description

Confiture ๐Ÿ“

PostgreSQL migrations, sweetly done

Confiture is the official migration tool for FraiseQL, designed with a build-from-scratch philosophy and 4 migration strategies to handle every scenario from local development to zero-downtime production deployments.

Part of the FraiseQL ecosystem - While Confiture works standalone for any PostgreSQL project, it's designed to integrate seamlessly with FraiseQL's GraphQL-first approach.

License: MIT Python 3.11+ PostgreSQL 12+ CI Code style: ruff Type checked: mypy Made with Rust Part of FraiseQL Status: Stable


Why Confiture?

Traditional migration tools (Alembic, Django migrations) replay migration history to build databases. This is slow and brittle.

Confiture treats DDL source files as the single source of truth:

  • โœ… Fresh databases in <1 second (not minutes)
  • โœ… 4 migration strategies (simple ALTER to zero-downtime FDW)
  • โœ… Production data sync built-in (with PII anonymization)
  • โœ… Python + Rust performance (10-50x faster than pure Python)
  • โœ… Perfect with FraiseQL, useful for everyone

The Four Mediums

1๏ธโƒฃ Build from DDL

confiture build --env production

Build fresh database from db/schema/ DDL files in <1 second.

2๏ธโƒฃ Incremental Migrations (ALTER)

confiture migrate up

Apply migrations to existing database (simple schema changes).

3๏ธโƒฃ Production Data Sync

confiture sync --from production --anonymize users.email

Copy production data to local/staging with PII anonymization.

4๏ธโƒฃ Schema-to-Schema Migration (Zero-Downtime)

confiture migrate schema-to-schema --strategy fdw

Complex migrations via FDW with 0-5 second downtime.


Quick Start

Installation

pip install fraiseql-confiture

# Or with FraiseQL integration
pip install fraiseql-confiture[fraiseql]

Initialize Project

confiture init

Creates:

db/
โ”œโ”€โ”€ schema/           # DDL: CREATE TABLE, views, functions
โ”‚   โ”œโ”€โ”€ 00_common/
โ”‚   โ”œโ”€โ”€ 10_tables/
โ”‚   โ””โ”€โ”€ 20_views/
โ”œโ”€โ”€ seeds/            # INSERT: Environment-specific test data
โ”‚   โ”œโ”€โ”€ common/
โ”‚   โ”œโ”€โ”€ development/
โ”‚   โ””โ”€โ”€ test/
โ”œโ”€โ”€ migrations/       # Generated migration files
โ””โ”€โ”€ environments/     # Environment configurations
    โ”œโ”€โ”€ local.yaml
    โ”œโ”€โ”€ test.yaml
    โ””โ”€โ”€ production.yaml

Build Schema

# Build local database
confiture build --env local

# Build production schema
confiture build --env production

Create Migration

# Edit schema
vim db/schema/10_tables/users.sql

# Generate migration
confiture migrate generate --name "add_user_bio"

# Apply migration
confiture migrate up

Documentation

๐Ÿ“– User Guides

๐Ÿ“š API Reference

๐Ÿ’ก Examples


Features

โœ… Complete (Phases 1-3)

Core Migration System:

  • โœ… Build from DDL (Medium 1) - Fresh databases in <1 second
  • โœ… Incremental migrations (Medium 2) - Simple ALTER-based changes
  • โœ… Production data sync (Medium 3) - Copy with PII anonymization
  • โœ… Zero-downtime migrations (Medium 4) - Schema-to-schema via FDW

Performance & Distribution:

  • โœ… Rust performance layer (10-50x speedup) ๐Ÿš€
  • โœ… Binary wheels for Linux, macOS, Windows
  • โœ… Parallel migration execution
  • โœ… Progress tracking with resumability

Developer Experience:

  • โœ… Environment-specific seed data (development/test/production)
  • โœ… Schema diff detection with auto-generation
  • โœ… CLI with rich terminal output and colors
  • โœ… --force flag for migration reapplication
  • โœ… Comprehensive documentation (5 guides, 4 API docs)
  • โœ… Production-ready examples (5 complete scenarios)

Integration & Safety:

  • โœ… FraiseQL GraphQL integration
  • โœ… Multi-environment configuration
  • โœ… Transaction safety with rollback support
  • โœ… PII anonymization with compliance tools
  • โœ… CI/CD pipeline examples (GitHub Actions)

๐Ÿšง Coming Soon (Phase 4)

  • Advanced migration hooks (before/after)
  • Custom anonymization strategies
  • Interactive migration wizard
  • Migration dry-run mode
  • Database schema linting

Comparison

Feature Alembic pgroll Confiture
Philosophy Migration replay Multi-version schema Build-from-DDL
Fresh DB setup Minutes Minutes <1 second
Zero-downtime โŒ No โœ… Yes โœ… Yes (FDW)
Production sync โŒ No โŒ No โœ… Built-in
Language Python Go Python + Rust

Development Status

Current Version: 0.3.2 (Production Release) ๐ŸŽ‰

Recent Updates (v0.3.2):

  • โœ… --force flag for migration reapplication
  • โœ… Comprehensive troubleshooting guide with 400+ lines
  • โœ… database_url connection format support
  • โœ… Enhanced CLI warnings and safety messages

Previous Release (v0.3.0):

  • โœ… Hexadecimal file sorting for better schema organization
  • โœ… Enhanced dynamic SQL file discovery
  • โœ… Recursive directory support with improved performance

Milestone Progress:

  • โœ… Phase 1: Python MVP (Complete - Oct 2025)
  • โœ… Phase 2: Rust Performance Layer (Complete - Oct 2025)
  • โœ… Phase 3: Production Features (Complete - Oct 2025)
    • โœ… Zero-downtime migrations (FDW)
    • โœ… Production data sync with PII anonymization
    • โœ… Comprehensive documentation (5 guides, 4 API references)
    • โœ… Production examples (5 complete scenarios)
  • โœ… CI/CD & Release Pipeline (Complete - Nov 2025)
    • โœ… Multi-platform wheel building (Linux, macOS, Windows)
    • โœ… PyPI Trusted Publishing
    • โœ… Quality gate with comprehensive checks
    • โœ… Python 3.11, 3.12, 3.13 support verified
  • โœ… v0.3.0: Enhanced Schema Building (Complete - Nov 2025)
    • โœ… Hexadecimal file sorting (0x01_, 0x0A_, etc.)
    • โœ… Dynamic discovery with patterns and filtering
    • โœ… Recursive directory support
    • โœ… Advanced configuration options
    • โœ… Comprehensive feature documentation
  • โณ Phase 4: Advanced Features (Q1 2026)
    • Migration hooks, wizards, dry-run mode

Statistics:

  • ๐Ÿ“ฆ 4 migration strategies implemented
  • ๐Ÿ“– 5 comprehensive user guides + 3 feature guides
  • ๐Ÿ“š 4 API reference pages
  • ๐Ÿ’ก 5 production-ready examples
  • ๐Ÿงช 89% test coverage (258 tests) - 3 new test files added
  • โšก 10-50x performance with Rust
  • ๐Ÿš€ Production-ready CI/CD pipeline
  • ๐Ÿ”ง Advanced file discovery with hex sorting support

See PHASES.md for detailed roadmap.


Contributing

Contributions welcome! We'd love your help making Confiture even better.

Quick Start:

# Clone repository
git clone https://github.com/fraiseql/confiture.git
cd confiture

# Install dependencies (includes Rust build)
uv sync --all-extras

# Build Rust extension
uv run maturin develop

# Run tests
uv run pytest --cov=confiture

# Format code
uv run ruff format .

# Type checking
uv run mypy python/confiture/

Resources:

What to contribute:

  • ๐Ÿ› Bug fixes
  • โœจ New features
  • ๐Ÿ“– Documentation improvements
  • ๐Ÿ’ก New examples
  • ๐Ÿงช Test coverage improvements

Author

Vibe-engineered by Lionel Hamayon ๐Ÿ“

Confiture was crafted with care as the migration tool for the FraiseQL ecosystem, combining the elegance of Python with the performance of Rust, and the sweetness of strawberry jam.


License

MIT License - see LICENSE for details.

Copyright (c) 2025 Lionel Hamayon


Acknowledgments

  • Inspired by printoptim_backend's build-from-scratch approach
  • Built for FraiseQL GraphQL framework
  • Influenced by pgroll, Alembic, and Reshape
  • Developed with AI-assisted vibe engineering โœจ

FraiseQL Ecosystem

Confiture is part of the FraiseQL family:

  • FraiseQL - Modern GraphQL framework for Python
  • Confiture - PostgreSQL migration tool (you are here)

Making jam from strawberries, one migration at a time. ๐Ÿ“โ†’๐Ÿฏ

Vibe-engineered with โค๏ธ by Lionel Hamayon

Documentation โ€ข GitHub โ€ข PyPI

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

fraiseql_confiture-0.3.2.tar.gz (334.4 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

fraiseql_confiture-0.3.2-cp314-cp314-win_amd64.whl (211.0 kB view details)

Uploaded CPython 3.14Windows x86-64

fraiseql_confiture-0.3.2-cp313-cp313-win_amd64.whl (211.0 kB view details)

Uploaded CPython 3.13Windows x86-64

fraiseql_confiture-0.3.2-cp313-cp313-macosx_11_0_arm64.whl (261.3 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

fraiseql_confiture-0.3.2-cp312-cp312-win_amd64.whl (211.1 kB view details)

Uploaded CPython 3.12Windows x86-64

fraiseql_confiture-0.3.2-cp312-cp312-manylinux_2_34_x86_64.whl (295.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

fraiseql_confiture-0.3.2-cp312-cp312-macosx_11_0_arm64.whl (261.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

fraiseql_confiture-0.3.2-cp311-cp311-win_amd64.whl (210.8 kB view details)

Uploaded CPython 3.11Windows x86-64

fraiseql_confiture-0.3.2-cp311-cp311-manylinux_2_34_x86_64.whl (297.2 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

fraiseql_confiture-0.3.2-cp311-cp311-macosx_11_0_arm64.whl (261.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

Details for the file fraiseql_confiture-0.3.2.tar.gz.

File metadata

  • Download URL: fraiseql_confiture-0.3.2.tar.gz
  • Upload date:
  • Size: 334.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fraiseql_confiture-0.3.2.tar.gz
Algorithm Hash digest
SHA256 7ec6aee98e602e5b53b3afcbcd7d3137fed0d9fe64979f4caf5feb2a545e64e1
MD5 24d555873c13774bc35256cd550c5a11
BLAKE2b-256 39d811a32162620e08398442db8a4be0267510829216d0856a09b88549912f9b

See more details on using hashes here.

File details

Details for the file fraiseql_confiture-0.3.2-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: fraiseql_confiture-0.3.2-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 211.0 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fraiseql_confiture-0.3.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 834a994afb4df618e46991882d06d174f7ba67449aa2802efc5f86938096ee8f
MD5 3155c65b05a826bed90a8e3f37726ef6
BLAKE2b-256 9b04c311eef6d03bb6f1397d467f7ef4d5982e05030e4a74365a6a364b8a0831

See more details on using hashes here.

File details

Details for the file fraiseql_confiture-0.3.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: fraiseql_confiture-0.3.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 211.0 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fraiseql_confiture-0.3.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 241bacc7a4d292d6649a7207cf73171247961b0220b008292603cbbddab64134
MD5 e61f313af578307cda7f9600401d9825
BLAKE2b-256 d3936bb531af3fe68f48f144b83f57201f8539a2456d0dca48202813f5105566

See more details on using hashes here.

File details

Details for the file fraiseql_confiture-0.3.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

  • Download URL: fraiseql_confiture-0.3.2-cp313-cp313-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 261.3 kB
  • Tags: CPython 3.13, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fraiseql_confiture-0.3.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 307a501b062a9d0d7e7b3c65be1d4187aefd5935dda73356bbd9cbd75a86e585
MD5 6ca8b2ff2578574696211e328c85487d
BLAKE2b-256 5afef2aa9ae34de831125b6bf845ca67673925957975e0a4f1e6effeca4432f5

See more details on using hashes here.

File details

Details for the file fraiseql_confiture-0.3.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: fraiseql_confiture-0.3.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 211.1 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fraiseql_confiture-0.3.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 9d9f564d5f22e6d9ce453074a51c06bf41935b11669e05981ae5443d0c6bf38e
MD5 1ecdbe21e684da8220bb48a20ac502d8
BLAKE2b-256 9068437b9469d795d8ff96ddd8d00dba6e940ddff81a63b641cc670f9a7b663d

See more details on using hashes here.

File details

Details for the file fraiseql_confiture-0.3.2-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

  • Download URL: fraiseql_confiture-0.3.2-cp312-cp312-manylinux_2_34_x86_64.whl
  • Upload date:
  • Size: 295.7 kB
  • Tags: CPython 3.12, manylinux: glibc 2.34+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fraiseql_confiture-0.3.2-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 5dbcae28ffc0f9b948f51c3ffca9d5424152797c4db6700966126e7e3cc05c31
MD5 441066bd88510d289dcfd89eb33b28bd
BLAKE2b-256 f8c0079c357d4fb059aaaa746af6b93c566b2ae42d01a6e1a1beba3f5880ed7f

See more details on using hashes here.

File details

Details for the file fraiseql_confiture-0.3.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

  • Download URL: fraiseql_confiture-0.3.2-cp312-cp312-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 261.2 kB
  • Tags: CPython 3.12, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fraiseql_confiture-0.3.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f1dbcb0b2240243f8c7b4aa3ff4f56ddb63eb9d3f5fb7254ab959cd45b5c95a8
MD5 edf4bccfaaf7d5f6525d4108ae3f19ac
BLAKE2b-256 ae6091fa3c2027ec9c50660faf1ce1fc30b33224cec60b6cc7ff606d5a83154c

See more details on using hashes here.

File details

Details for the file fraiseql_confiture-0.3.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: fraiseql_confiture-0.3.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 210.8 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fraiseql_confiture-0.3.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 743f677a6839e74017afc7e1343344b3adfa212ed041d03add30740a2f703cef
MD5 2fe447a9f84004544444af6ae0fc6610
BLAKE2b-256 dd6502396bbf634b1a7666625d4cb5cc948dc40524da791c73ceef1ee848744f

See more details on using hashes here.

File details

Details for the file fraiseql_confiture-0.3.2-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

  • Download URL: fraiseql_confiture-0.3.2-cp311-cp311-manylinux_2_34_x86_64.whl
  • Upload date:
  • Size: 297.2 kB
  • Tags: CPython 3.11, manylinux: glibc 2.34+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fraiseql_confiture-0.3.2-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 5fe90a9b22603ff9c1495599417210d5b66abd3edd97c65a6124c091b5502a12
MD5 e258cbe00f8ac53ea1a98c7e6f79d547
BLAKE2b-256 bca2d79f10034c168241f1e21e424a4057201060eb0e7caba1de74b08e0ca9f0

See more details on using hashes here.

File details

Details for the file fraiseql_confiture-0.3.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

  • Download URL: fraiseql_confiture-0.3.2-cp311-cp311-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 261.5 kB
  • Tags: CPython 3.11, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fraiseql_confiture-0.3.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f8d2d8eea4ec6247a15a97250b2d7183d87799e60bf3610ec2136e129cd38ff2
MD5 fa2b8bcf69bc5aff75e996aab411a4fc
BLAKE2b-256 69325b10d7d059baa976aeb68ec2208948ef479ee53898f4d5acdc54edc367e3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page