It's impossible to have "zero downtime" with db updates. Most people put the site in maintenance mode (after prewarning the users in advance the site will be unavailable for some time), do the updates, then put the site back up.
I think the only way to do a true zero downtime deployment is to whip up a new server, install everything fresh on that, run the db changes. Once it's completed, kill the old server and switch to the new. That way the people on the live server are left unaffected as nothing is actually changing until you switch servers.
A very large company I used to contract with did it that way (they had about 10 app servers). They used ansible and just threw away the old servers and built new ones with the latest os updates/code/db, etc. They didn't "upgrade" the existing servers. They just built up new ones, and deleted the old ones once everything was switched over. It was all automated, and pretty sweet. They were a lot more masterful at devops than I am though, but it seems to fit the scenario you are wanting.