Implement automatic database migration system
Following design in ADR-020, implementation guidance, and quick reference. Phase 1: Migration System Core (starpunk/migrations.py) - Create migration runner with fresh database detection - Implement is_schema_current() heuristic for fresh DB detection - Add helper functions (table_exists, column_exists, index_exists) - Complete error handling with MigrationError exception - 315 lines of production code Phase 2: Database Integration (starpunk/database.py) - Modify init_db() to call run_migrations() - Add logger parameter handling - 5 lines changed for integration Phase 3: Comprehensive Testing (tests/test_migrations.py) - 26 tests covering all scenarios (100% pass rate) - Tests for fresh DB, legacy DB, helpers, error handling - Integration test with actual migration file - 560 lines of test code Phase 4: Version and Documentation - Bump version to 0.9.0 (MINOR increment per versioning strategy) - Update CHANGELOG.md with comprehensive v0.9.0 entry - Create implementation report documenting all details Features: - Fresh database detection prevents unnecessary migrations - Legacy database detection applies pending migrations automatically - Migration tracking table records all applied migrations - Idempotent execution safe for multiple runs - Fail-safe: app won't start if migrations fail - Container deployments now fully automatic Testing: - All 26 migration tests passing (100%) - Fresh database scenario verified (auto-skip) - Legacy database scenario verified (migrations applied) - Idempotent behavior confirmed Documentation: - Implementation report in docs/reports/ - CHANGELOG.md updated with v0.9.0 entry - All architecture decisions from ADR-020 implemented 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -69,29 +69,38 @@ CREATE INDEX IF NOT EXISTS idx_auth_state_expires ON auth_state(expires_at);
|
||||
|
||||
def init_db(app=None):
|
||||
"""
|
||||
Initialize database schema
|
||||
Initialize database schema and run migrations
|
||||
|
||||
Args:
|
||||
app: Flask application instance (optional, for config access)
|
||||
"""
|
||||
if app:
|
||||
db_path = app.config["DATABASE_PATH"]
|
||||
logger = app.logger
|
||||
else:
|
||||
# Fallback to default path
|
||||
db_path = Path("./data/starpunk.db")
|
||||
logger = None
|
||||
|
||||
# Ensure parent directory exists
|
||||
db_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Create database and schema
|
||||
# Create database and initial schema
|
||||
conn = sqlite3.connect(db_path)
|
||||
try:
|
||||
conn.executescript(SCHEMA_SQL)
|
||||
conn.commit()
|
||||
print(f"Database initialized: {db_path}")
|
||||
if logger:
|
||||
logger.info(f"Database initialized: {db_path}")
|
||||
else:
|
||||
print(f"Database initialized: {db_path}")
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
# Run migrations
|
||||
from starpunk.migrations import run_migrations
|
||||
run_migrations(db_path, logger=logger)
|
||||
|
||||
|
||||
def get_db(app):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user