DEV Community

丁久
丁久

Posted on • Originally published at dingjiu1989-hue.github.io

Database Migration Tools and Strategies

This article was originally published on AI Study Room. For the full version with working code examples and related articles, visit the original post.

Database Migration Tools and Strategies

Database Migration Tools and Strategies

Database Migration Tools and Strategies

Database Migration Tools and Strategies

Database Migration Tools and Strategies

Database Migration Tools and Strategies

Database Migration Tools and Strategies

Database Migration Tools and Strategies

Why Database Migrations Matter

Database migrations are how you version-control your schema changes. Without a migration system, schema changes are applied manually, untracked, and unrepeatable. Migrations ensure that every environment (dev, staging, production) has the same schema, changes are auditable, and rollbacks are possible.

Migration Tools by Language

| Language | Tool | Pros | |----------|------|------| | Python | Alembic (SQLAlchemy) | Auto-generation, async support | | Node.js | Knex.js | Transactional migrations, seed support | | Ruby | ActiveRecord Migrations | Simple DSL, mature ecosystem | | Java | Flyway, Liquibase | Repeatable migrations, CI/CD friendly | | Go | golang-migrate, Goose | No-dependency binaries | | Rust | Diesel | Type-safe, compile-time checking |

Alembic (Python)

Setup

pip install alembic

alembic init alembic

alembic/env.py

from myapp.models import Base

target_metadata = Base.metadata

Creating Migrations

Auto-generate migration

alembic revision --autogenerate -m "add user roles table"

Apply migrations

alembic upgrade head

Rollback

alembic downgrade -1

Migration File

"""add user roles table

Revision ID: abc123

Revises: def456

"""

from alembic import op

import sqlalchemy as sa

def upgrade():

op.create_table(

'user_roles',

sa.Column('id', sa.Integer(), nullable=False),

sa.Column('user_id', sa.Integer(), nullable=False),

sa.Column('role', sa.String(length=50), nullable=False),

sa.Column('created_at', sa.DateTime(), server_default=sa.func.now()),

sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'),

sa.PrimaryKeyConstraint('id')

)

op.create_index('ix_user_roles_user_id', 'user_roles', ['user_id'])

def downgrade():

op.drop_index('ix_user_roles_user_id')

op.drop_table('user_roles')

Flyway (Java)

Migration naming convention:

V1__create_users.sql

V2__add_email_column.sql

V3__create_orders_table.sql


Read the full article on AI Study Room for complete code examples, comparison tables, and related resources.

Found this useful? Check out more developer guides and tool comparisons on AI Study Room.

Top comments (0)