Updated
—
3 min read
While the Payload documentation is comprehensive regarding PostgreSQL migrations, there's a simpler mental model for handling migrations on both development and production.
payload migrate:create to generate migration files onlypayload migrate)payload migrate to apply migrationsThat's it.
Drizzle push is cool in theory, but brittle in practice. You're likely to encounter "column does not exist" and other schema mismatch errors frequently.
ImportantI recommend disabling Drizzle automatic schema push in your Payload config file, as you'll otherwise likely encounter schema mismatch errors frequently.
To disable Drizzle automatic schema push, you can set the push option to false in your Payload config file.
export default config({ // ... db: postgresAdapter( pool: { connectionString: process.env.DATABASE_URL, }, push: false // Disable Drizzle push ) });
The Payload documentation is a bit misleading on this point. Their recommendation to keep Drizzle push only holds if all of the following are true:
Under those conditions, push can feel magical.
But importantly (and what the docs don't mention): Drizzle push is not a schema migration system.
It is:
Payload's docs frame the choice as:
"Push vs migrations"
But the real choice is:
"Sandbox convenience vs deterministic correctness"
I'd take the latter any day.
Disabling Drizzle push changes the local development workflow slightly:
payload migrate:create to generate migration filespayload migrate to apply migrations (Drizzle push is disabled)And the production workflow remains the same:
payload migrate to apply migrationsThis will make your local dev much easier, otherwise you'll likely find yourself dropping the database and starting over frequently.
Hope this helps!
Join my newsletter for lessons, experiments, and failures in bootstrapping online businesses.
Sign up if you're curious. I’ll only email you if it's actually good.

Meet the Author
Ryan Chiang
Hello, I'm Ryan. I build things and write about them. This is my blog of my learnings, tutorials, and whatever else I feel like writing about.
What I'm currently building →.