Heroku:为 Phoenix 重新初始化数据库

Heroku: reinitialize database for Phoenix

这主要是为了测试目的,但是我怎样才能在Heroku上达到mix ecto.reset一样的效果。这样的命令导致 FATAL: permission denied for database "template1"drop 阶段。但我想删除所有表并重置所有增量计数器等

据我所知,Heroku 不允许您 'drop' 数据库,但确实内置了可以让您重置数据库的命令。

如果你有 heroku 的 CLI 工具包,你应该能够运行这些命令:

heroku pg:reset DATABASE_NAME

那你可以运行

heroku run mix ecto.migrate

这应该会重置您所有的计数器以及您之后的所有其他内容。

有关详细信息,请查看 Heroku 网站上的 link here

完整步骤:

heroku pg:info // get db_name from add-on field. 
heroku pg:reset DB_NAME
heroku run MIX_ENV=prod mix ecto.migrate
heroku run MIX_ENV=prod mix run priv/repo/seeds.exs

最后,您可以使用 heroku restart

重新启动测功机

heroku run mix ecto.migrate 仅当您直接在 dyno 上 运行ning Elixir 时才有效(例如,使用 Elixir buildpack)。如果您 运行 将 Elixir 应用程序放在容器中(就像我一样),它将无法工作。

heroku pg:push 会将本地数据库复制到您的 Heroku Postgres 实例。您可以像这样重置开发数据库和 Heroku 数据库:

mix ecto.reset
heroku pg:reset DATABASE_URL
heroku pg:push my_app_dev DATABASE_URL -a my_app

注:

  • heroku pg:push 需要一个空数据库,因此您需要事先 运行 heroku pg:reset。在原始问题中描述的场景中,这是预期的效果,但如果您不想先清空数据库,这将(不一定)对您有用。

  • 有相应的heroku pg:pull命令将数据库向相反方向移动。如果您需要对数据库进行大的更改,无法完全重置它,但是 可以 容忍一点停机时间,您可以从 Heroku 中提取数据库,使您的变化,并将其推回。在尝试此操作之前,请确保您知道自己在做什么。

heroku pg:pushheroku pg:pull 记录在 https://devcenter.heroku.com/articles/heroku-postgresql#pg-push-and-pg-pull