docker容器内的ecto.reset不起作用

时间:2018-08-04 15:46:31

标签: postgresql docker elixir phoenix-framework ecto

我正在使用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';

我在做什么错了?

1 个答案:

答案 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