Existing databases that already ran an old migration kept stale NOT
NULL constraints and mismatched column types/defaults, because the
schema writer only emitted idempotent ADD COLUMN IF NOT EXISTS guards
and never altered columns that already existed.
- Emit guarded ALTER COLUMN ... SET/DROP NOT NULL when a column's
nullability differs from the model.
- Emit guarded ALTER COLUMN ... TYPE, falling back to renaming the old
column and adding a fresh one when the in-place conversion fails.
- Emit guarded ALTER COLUMN ... SET/DROP DEFAULT for default drift.
- Collapse the previously duplicated plain/guarded templates so
WriteSchema (full-schema, live-state-checking) and WriteMigration
(diff-based) share the same guarded SQL templates and Go helpers
instead of maintaining the logic twice.