Files
LangBot/src/langbot/pkg/persistence/migrations/README.md
RockChinQ a2c6c8201b refactor(persistence): freeze legacy DB migration chain, drop dbm026
The legacy pkg/persistence/migrations (DBMigration / dbmXXX) system now
coexists with Alembic but accepts no new migrations — all new schema
changes go through Alembic.

- remove dbm026_llm_model_context_length (superseded by Alembic
  0005_add_llm_context_length, which makes the identical change)
- cap required_database_version at 25 (legacy chain dbm001-025 kept
  read-only to upgrade pre-existing 3.x DBs to the Alembic baseline)
- add migrations/README.md documenting the freeze
- document the Alembic-only policy and revision-id/idempotency rules in
  AGENTS.md
2026-06-13 05:26:08 -04:00

1.6 KiB

Legacy migrations (DEPRECATED — do not add new files here)

This directory holds the legacy 3.x database migration system (DBMigration subclasses in dbmXXX_*.py, registered via @migration.migration_class(N) and run from pkg/persistence/mgr.py).

This system is frozen. Do not add new dbmXXX_*.py migrations.

The chain is capped at version 25 (required_database_version = 25 in pkg/utils/constants.py). These files exist only to upgrade pre-existing 3.x databases up to the Alembic baseline (0001_baseline). Removing them would break in-place upgrades from old installations, so they are kept read-only.

All new schema changes use Alembic

Migrations now live in pkg/persistence/alembic/versions/. To create one:

uv run python -m langbot.pkg.persistence.alembic_runner autogenerate "description of your change"

(requires data/config.yaml to exist). Review and edit the generated script before committing — Alembic migrations run automatically on startup and must be idempotent and guard against missing tables (the test suite runs them against empty databases).

Rules for Alembic revision ids

  • Keep the revision id ≤ 32 characters — PostgreSQL stores alembic_version.version_num as varchar(32) and will raise StringDataRightTruncationError on overflow.
  • Guard every op call against a missing table / missing column (inspector.get_table_names() / inspector.get_columns()); fresh installs create the schema via create_all() and stamp the baseline, so migrations may run against tables that already match or do not exist.