我有一个Rails应用程序,它使用PostgreSQL作为后端,带有一个try 模拟生产的cert环境,只是它需要定期重置数据库以进行QA.

在部署期间,当我try 从Capistrano任务执行db:reset时,我会收到错误:

ERROR: database "database_name" is being accessed by other users

数据库不能作为重置任务的一部分删除,从而导致部署失败.有没有办法从Capistrano重置数据库连接,以便成功删除该表?从Capistrano任务将SQL管道化到psql可能可行,但我想知道是否有更好的方法来实现这一点.

推荐答案

我已经将dbenhur's answer与Capistrano任务结合起来,以达到我所需的效果,就像魅力一样:

desc 'kill pgsql users so database can be dropped'
task :kill_postgres_connections do
  run 'echo "SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname=\'database_name\';" | psql -U postgres'
end

这假设用户帖子的auth_方法在pg_hba中设置为"信任".形态

然后你可以在部署任务中调用它,在update_code之后到migrate之前

after 'deploy:update_code', 'kill_postgres_connections'

Postgresql相关问答推荐

我无法在过程中提交

计算两个子查询之间的差异

端口5432失败:致命:数据库xxx&不存在.在PostgreSQL数据库中

无法在kubernetes中设置postgres复制

Postgres 对 WHERE 子句并行使用两个索引

在 Postgresql 中实现自定义运算符时出错

Postgres 将分区附加到表的时间太长.想明白为什么

Supabase 数据库大小问题

从 PostgreSQL 中的每个组中抽取 N 个样本

如何在 Sequelize ORM 中插入 PostGIS GEOMETRY 点?

带有双引号的 postgresql COPY 和 CSV 数据

在 PostgreSQL 中Explain与explain analyze

为什么 PostgreSQL 数组访问在 C 中比在 PL/pgSQL 中快得多?

声明变量set = select

从 PostgreSQL 中的时间戳获取日期

用于更改 postgresql 用户密码的 bash 脚本

try 为 ror 应用程序设置 postgres,出现错误 - fe_sendauth:no password supplied

Windows 上的 GeoDjango:Could not find the GDAL library" / "OSError: [WinError 126] The specified module could not be found

在 postgresql 中对使用 array_agg 创建的文本聚合进行排序

判断 Postgres 中是否存在序列(plpgsql)