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
  • โœ… 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.0 (Production Release) ๐ŸŽ‰

Recent Updates (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.1.tar.gz (327.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.1-cp314-cp314-win_amd64.whl (210.1 kB view details)

Uploaded CPython 3.14Windows x86-64

fraiseql_confiture-0.3.1-cp313-cp313-win_amd64.whl (210.1 kB view details)

Uploaded CPython 3.13Windows x86-64

fraiseql_confiture-0.3.1-cp313-cp313-macosx_11_0_arm64.whl (260.3 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

fraiseql_confiture-0.3.1-cp312-cp312-win_amd64.whl (210.2 kB view details)

Uploaded CPython 3.12Windows x86-64

fraiseql_confiture-0.3.1-cp312-cp312-manylinux_2_34_x86_64.whl (294.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

fraiseql_confiture-0.3.1-cp312-cp312-macosx_11_0_arm64.whl (260.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

fraiseql_confiture-0.3.1-cp311-cp311-win_amd64.whl (209.9 kB view details)

Uploaded CPython 3.11Windows x86-64

fraiseql_confiture-0.3.1-cp311-cp311-manylinux_2_34_x86_64.whl (296.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

fraiseql_confiture-0.3.1-cp311-cp311-macosx_11_0_arm64.whl (260.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: fraiseql_confiture-0.3.1.tar.gz
  • Upload date:
  • Size: 327.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.1.tar.gz
Algorithm Hash digest
SHA256 f69dacebb6397e6ade96f3e13db0880c110856f84c60f2dfbc432262d7774744
MD5 bb3bfd68713fbf104c1e9f161076e76d
BLAKE2b-256 c2c0d02bb525acd3fdbd736d5fe5f16dc0ad108803b4bfedf7557b141400be5d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fraiseql_confiture-0.3.1-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 210.1 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.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 0798258f77558e6dd251cba917f91e34ae0502cd7406f08dab8b23ff35391d34
MD5 06978c0d89905e63d13d90baceffe511
BLAKE2b-256 929b515307e433b7be09e92b46540f2b26dcc03de4258b3dd9faabef7d3dc472

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fraiseql_confiture-0.3.1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 210.1 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.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 078b979b53402249b91c9939bf5c7221740168627d3493307165c39b22834adb
MD5 8722cb1ae09387afb1279622a0c21136
BLAKE2b-256 f21dfc3641324726fd9f7da12502f207d0388520d068e13c089b221ff8a7ccdb

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fraiseql_confiture-0.3.1-cp313-cp313-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 260.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.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b8520cc3d39d861ced7b2b79f3bb8c01c95081614333c2291f648fda784be0c2
MD5 0d948b00b50e575d438cb46a60a2b453
BLAKE2b-256 c94d52d23bf9f24a16d6ea501be98cabcff881e9fb825759f87ec8fd696fc521

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fraiseql_confiture-0.3.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 210.2 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.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 25e6aa2d32feed2b8e4a4a9be546ac1e6c860bb1c5685ba387a9ae67a265574f
MD5 6f90bac834a4c9c6d26381a2175b4069
BLAKE2b-256 ec85bf8cb39cee99b3a698a7d0d47b8f983cd8e8d3594f5a6b70f724100060ec

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fraiseql_confiture-0.3.1-cp312-cp312-manylinux_2_34_x86_64.whl
  • Upload date:
  • Size: 294.8 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.1-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 f9bbe45cff6d36760715d73d32354ac1c89072e0f119b4a16a51236dcccd56e5
MD5 8b161945ba41472d03e91e94a06f3a55
BLAKE2b-256 fb0a3732270fec556ea5ddcb7aae2c460d4a8a5ed2d85121464ba97029f47068

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fraiseql_confiture-0.3.1-cp312-cp312-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 260.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.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9adc9cb5393cc784a6d81c01329d68f84451a0437399e4fe0f6ae8b34f31e9e4
MD5 25346b7a1d572947f4382a58f3d65cbb
BLAKE2b-256 730e013e211a59f65c35759ffdd1eda64203f781097478e53922c41cbc82a8f2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fraiseql_confiture-0.3.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 209.9 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.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 60012fd9900fbebf55136d0f0f7da6453c5483142d3ca757b1c7d1400927fb23
MD5 dc3768c39d30929b45706ddeca9ed7dc
BLAKE2b-256 ed650392ea459f09b99c80265ec098444bcb5ec3365bbbcbc008eeca728ec421

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fraiseql_confiture-0.3.1-cp311-cp311-manylinux_2_34_x86_64.whl
  • Upload date:
  • Size: 296.3 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.1-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 2505fb2116ec1440cd2e8465dd525cab27a7e7cc6ba5413042a199b4f40e1c59
MD5 ff56926924c60f064db28b3ffde0c19e
BLAKE2b-256 0129175f223bb1de4424ea92ce11a67d2ad4c90bffaea5c5e752869c983dead7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fraiseql_confiture-0.3.1-cp311-cp311-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 260.6 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.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b1995d5fbc08213ccb3678c5311232d39d9012c148f39080470a447277f77ef9
MD5 be211e4734c37f7f3ac3b9b769440b1b
BLAKE2b-256 71e8a030aa33f30945fa3f401813e48de793ead7d6acd22ed84c1c432e50501f

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