我正在使用Phoenix和PostgreSQL构建RESTful API,并使用docker-compose在单独的docker容器中运行Phoenix应用程序和数据库。如果将外壳附加到Phoenix容器并键入mix ecto.reset
以重置数据库,则会出现以下错误:
** (Mix) The database for Home.Repo couldn't be dropped: ERROR 55006 (object_in_use):
database "home" is being accessed by other users
There are 10 other sessions using the database.
我已经尝试过了:
REVOKE CONNECT ON DATABASE dbname FROM PUBLIC, username;
SELECT
pg_terminate_backend(pid)
FROM
pg_stat_activity
WHERE
pid <> pg_backend_pid()
AND datname = 'database_name';
我在做什么错了?
答案 0 :(得分:2)
在这种情况下,您不应该仅停止牛仔Web服务器,因为它需要重新启动许多phoenix依赖关系,并且很可能会有一棵Supervision树来还原该过程,如果您发现它并自己杀死它。因此,如前所述,您应该使用iex中的Application.stop(:your_app)停止整个phoenix服务器,然后执行ecto.reset并重新启动它。
尽管不需要在正在运行的应用程序中使用ecto reset,但ecto.reset可以执行以下操作:"ecto.drop", "ecto.create", "ecto.migrate"
。您应该检查删除是否确实必要,因为在依赖数据库的运行应用程序中这是不可能的。
例如,如果出于测试目的而重置,则还应该选中Ecto.Sandbox,它为每个测试设置一个副本数据库: https://hexdocs.pm/ecto/Ecto.Adapters.SQL.Sandbox.html#content