Until now, applying a schema change meant OVERWRITE-ing the
whole table. That works, but it is a blunt instrument: it rewrites clauses
you never touched and makes every diff look total. The new CLI does the
careful thing instead.
sc gen now diffs your schema into clause-level
ALTER TABLE and ALTER FIELD statements (and
REMOVE + DEFINE for indexes). Migrations touch
only what changed and preserve everything they do not mention. Edit one
field type and you get one ALTER FIELD, not a rewritten table.
Try it
Change the schema (an enum value plus a new optional field), and the generator emits the migration below.
export const User = defineTable("user", {
name: s.string(),
email: s.string().email(),
role: s.enum(["admin", "member", "owner"]),
lastSeen: s.datetime().optional(),
}); -- migrations/0002_user.surql
ALTER FIELD role ON TABLE user TYPE "admin" | "member" | "owner";
DEFINE FIELD lastSeen ON TABLE user TYPE option<datetime>; Safe migrations, not rip-and-replace — and every up/down round-trips on real SurrealDB.
Pair this with sc check, which replays every migration from
zero on a throwaway database and confirms it reproduces your declared
schema. Together they catch the bug every DDL tool has but few detect: a
migration that no longer builds the schema it claims to.