惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
博客园_首页
WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
有赞技术团队
有赞技术团队
阮一峰的网络日志
阮一峰的网络日志
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
酷 壳 – CoolShell
酷 壳 – CoolShell
Y
Y Combinator Blog
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
T
The Blog of Author Tim Ferriss
云风的 BLOG
云风的 BLOG
博客园 - 司徒正美
Engineering at Meta
Engineering at Meta
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
J
Java Code Geeks
Stack Overflow Blog
Stack Overflow Blog
N
Netflix TechBlog - Medium
Martin Fowler
Martin Fowler
宝玉的分享
宝玉的分享
G
Google Developers Blog
Last Week in AI
Last Week in AI

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Database Migrations & Seeders: Stop Writing Manual SQL Sc...
Umadhar M · 2026-04-30 · via DEV Community

Umadhar M

If you've ever said "I forgot to run the ALTER TABLE on production" — this post is for you.

Manual database changes are one of the most common causes of production incidents. A developer adds a column locally, merges the feature, deploys — and the app crashes because nobody ran the SQL on the live server.

Migrations and seeders solve this completely. But the tooling is different for every stack, and most guides only cover one framework. This one covers all of them.

The Core Idea

Instead of running SQL manually, you write versioned migration files as part of your normal code. They get reviewed in pull requests, committed to git, and run automatically during deployment. Nobody forgets a column again.

Two concepts to understand:

  • Migration — a versioned script for schema changes (CREATE TABLE, ALTER, ADD COLUMN). Applied once, tracked by the framework.
  • Seeder — scripted insertion of reference or initial data. Always written to be idempotent — meaning it can run multiple times without duplicating data.

Why Not Just Write the SQL Directly?

Many teams start with raw SQL scripts shared over Slack or stored in a scripts/ folder. This breaks down fast:

  • No guarantee the script ran on every environment
  • No rollback if something goes wrong
  • No audit trail of who changed what and when
  • New developers have no idea what order to run things in

Migration tools solve all of this by tracking every change in a dedicated table in your database. If a migration has already run, it skips it. If it hasn't, it applies it. Simple and reliable.

Quick Example — Python Flask (Alembic + SQLAlchemy)

# Install
pip install alembic sqlalchemy
alembic init migrations

Enter fullscreen mode Exit fullscreen mode

# migrations/versions/xxxx_add_email_to_users.py
def upgrade():
    op.add_column('users',
        sa.Column('email', sa.String(255), nullable=True)
    )

def downgrade():
    op.drop_column('users', 'email')

Enter fullscreen mode Exit fullscreen mode

# Run it
alembic upgrade head

# Check status
alembic current
alembic history

Enter fullscreen mode Exit fullscreen mode

Seeder — always check before inserting to keep it idempotent:

# seed.py
session = Session()
for role_name in ['ADMIN', 'USER']:
    if not session.query(Role).filter_by(name=role_name).first():
        session.add(Role(name=role_name))
session.commit()
print('Seeding complete.')

Enter fullscreen mode Exit fullscreen mode

python seed.py

Enter fullscreen mode Exit fullscreen mode

What About Existing Apps With No Migrations Yet?

This is the most common question. If your app is already running:

  1. Export your current schema as a baseline migration file
  2. Tell the migration tool to mark it as "already applied"
  3. From that point — all future changes go through migration files only
  4. Update your CI/CD pipeline to run migrations on every deploy

For Flask/Alembic specifically, use alembic stamp head to mark the current state as the baseline without running anything. From that point forward, every schema change is a new migration file.

The Full Guide

The complete article covers all 7 frameworks with full code examples:

  • Spring Boot — Flyway + Hibernate
  • NodeJS — Sequelize CLI
  • Python/Django — Built-in migrations
  • Python/Flask & FastAPI — Alembic + SQLAlchemy
  • Laravel — Artisan migrations
  • Core PHP — Phinx
  • Flutter — sqflite local DB versioning

It also includes:

  • CI/CD pipeline integration examples
  • Post-deploy verification scripts for each stack
  • Idempotency patterns for seeders (MySQL, PostgreSQL, SQLite)
  • A complete FAQ on common migration mistakes

👉 Read the full guide here: Database Migrations & Seeders Best Practices — The DevTools Online


I also built a free collection of developer utilities at thedevtools.online — tools like SQL Formatter, JSON Formatter, JWT Decoder and 40+ more, all browser-based with no login required.