Skip to main content

Caribou is a simple SQLite database migrations library, built

Project description

Caribou SQLite Migrations

Caribou

Caribou is a small, simple SQLite database migrations library for Python, built primarily to manage the evolution of client side databases over multiple releases of an application.

Example

Here is a simple example illustrating how to use Caribou to manage your SQLite schema:

Create a Migration

Use Caribou's command line tool to create your first migration:

$ caribou create my_first_migration
created migration ./v20091115140758_my_first_migration.py

Edit Your Migration

Let's create a table with some data in the upgrade step and reverse the changes in the downgrade step.

"""
An example of a Caribou migration file.
"""

def upgrade(connection):
    # connection is a plain old sqlite3 database connection
    sql = """
        create table animals
        ( name     TEXT
        , status   TEXT
        ) """
    connection.execute(sql)

    animals = [ ('caribou', 'least concerned')
              , ('bengal tiger', 'threatened')
              , ('eastern elk', 'extinct')
              ]
    sql = 'insert into animals values (?, ?)'
    for name, status in animals:
        connection.execute(sql, [name, status])

    connection.commit()

def downgrade(connection):
    connection.execute('drop table animals')

Caribou migrations are flexible because they are plain Python files. Feel free to add logging, DDL transactions, anything at all.

Run Your Migration:

Caribou migrations can be run with the command line tool:

$ caribou upgrade db.sqlite .
upgrading db [db.sqlite] to most recent version
upgraded [db.sqlite] successfully to version [20091115140758]

# if you want to revert your changes, use the downgrade command:

$ caribou downgrade db.sqlite . 0
downgrading db [db.sqlite] to version [0]
downgraded [db.sqlite] successfully to version [0]

Since Caribou is built to manage client side SQLite databases, it can also be run programmatically from within your application:

"""
An example illustrating how to run a migration programmatically.
"""

import caribou

db = 'db.sqlite'
migrations_dir = '/path/to/migrations/dir'
version = '20091115140758'

# upgrade to most recent version
caribou.upgrade(db, migrations_dir)

# upgrade to a specific version
caribou.upgrade(db, migrations_dir, version)

# downgrade to a specific version
caribou.downgrade(db, migrations_dir, version)

Module-Based Migrations

When bundling your app with PyInstaller, Poetry, or similar tools, filesystem-based migration discovery may not work. You can pass a list of already-imported migration modules directly to upgrade() and downgrade():

import caribou
from myapp.migrations import v20240101120000_create_users, v20240215090000_add_scores

modules = [v20240101120000_create_users, v20240215090000_add_scores]

# upgrade using modules
caribou.upgrade("my.db", modules)

# downgrade using modules
caribou.downgrade("my.db", modules, "0")

Migration files use a v-prefix naming convention (v20240101120000_name.py) that is both importable as a Python module and sortable by version. The naming convention in versions 0.5 and below (20240101120000_name.py) continues to work for directory-based discovery.

To convert existing migrations to the new convention, simply add a v prefix to the filename (e.g. rename 20240101120000_name.py to v20240101120000_name.py).

That's it. You're rolling.

Installation

pip install caribou

Licence

Caribou is in the public domain.

Development

Things to know, before you start hacking Caribou:

Unit Tests

The unit test suite uses pytest and tox. To install and run:

uv sync
tox

Appendix

Haven't got enough?

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

caribou-0.6.0.tar.gz (7.4 kB view details)

Uploaded Source

Built Distribution

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

caribou-0.6.0-py3-none-any.whl (8.5 kB view details)

Uploaded Python 3

File details

Details for the file caribou-0.6.0.tar.gz.

File metadata

  • Download URL: caribou-0.6.0.tar.gz
  • Upload date:
  • Size: 7.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"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 caribou-0.6.0.tar.gz
Algorithm Hash digest
SHA256 40b26c097017338b8c3fa18ce04421c0f7a5bb88d037fc68b1d531494d4e8cd1
MD5 867d4e2cdcf2ccb2b16251c642bfa608
BLAKE2b-256 d848a096f991966905ce0a2887a89b05e03c1b4eed7f1dc9cf1502158b5d2eb6

See more details on using hashes here.

File details

Details for the file caribou-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: caribou-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 8.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"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 caribou-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 342e51a6404efb56de620c99b9edf8afb4516e5e5aea64ecc136f5191af0a14c
MD5 9622f619d3d362d6722f62a485db2c4a
BLAKE2b-256 31ad11f8ecbb7b4b6aeb6d00bda81dbea13964304986eb933f312be569c09539

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