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