Ecto.reset 在 docker 容器内不起作用

Ecto.reset inside docker container does not work

我正在使用 Phoenix 和 PostgreSQL 构建 RESTful API 并且 运行 Phoenix 应用程序和数据库在单独的 docker 容器中使用 docker-撰写。如果我将 shell 附加到 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';

我做错了什么?

在这种情况下,您不应该只停止 cowboy 网络服务器,因为它需要许多 phoenix 依赖项才能重新启动,并且很可能会有一个监督树来恢复进程,如果您找到它并自己杀死它.因此,如前所述,您应该在 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