Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 当您或其他任何人连接到目标数据库时,无法执行t。如何强制rails删除数据库?我应该使用PostgresSQL命令定义我自己的rake操作吗?我必须将sudo添加到xargs并更改数据库名称,但它可以工作。我也一样。。。更改为“sudo xargs kil_Ruby On Rails_Postgresql - Fatal编程技术网

Ruby on rails 当您或其他任何人连接到目标数据库时,无法执行t。如何强制rails删除数据库?我应该使用PostgresSQL命令定义我自己的rake操作吗?我必须将sudo添加到xargs并更改数据库名称,但它可以工作。我也一样。。。更改为“sudo xargs kil

Ruby on rails 当您或其他任何人连接到目标数据库时,无法执行t。如何强制rails删除数据库?我应该使用PostgresSQL命令定义我自己的rake操作吗?我必须将sudo添加到xargs并更改数据库名称,但它可以工作。我也一样。。。更改为“sudo xargs kil,ruby-on-rails,postgresql,Ruby On Rails,Postgresql,当您或其他任何人连接到目标数据库时,无法执行t。如何强制rails删除数据库?我应该使用PostgresSQL命令定义我自己的rake操作吗?我必须将sudo添加到xargs并更改数据库名称,但它可以工作。我也一样。。。更改为“sudo xargs kill”,硬编码db_名称为“我的开发数据库名称”task“db:drop”=>:kill_postgres_connections我认为应该删除这一行,从我的观点来看,这有可能扩展系统任务的行为。而不是硬编码数据库名称,只需使用以下命令:db\u


当您或其他任何人连接到目标数据库时,无法执行t。如何强制rails删除数据库?我应该使用PostgresSQL命令定义我自己的rake操作吗?我必须将sudo添加到xargs并更改数据库名称,但它可以工作。我也一样。。。更改为“sudo xargs kill”,硬编码db_名称为“我的开发数据库名称”
task“db:drop”=>:kill_postgres_connections
我认为应该删除这一行,从我的观点来看,这有可能扩展系统任务的行为。而不是硬编码数据库名称,只需使用以下命令:
db\u name=Rails.configuration.database\u configuration[Rails.env]['database']
在我的系统中,我使用的是
sudo kill-9`ps-u postgres-o pid=`
,这样就不会由
ps
打印pid头,也就不会向
kill
传递字符串参数,也就不会引发错误。在任何情况下,这都是一个很好的建议。我不断地投上下票,结果几乎是零分。这似乎是一个有争议的“快速解决方案”。让我郑重声明,我确实警告过这是危险的如果您在Ubuntu上,请使用此命令再次启动postgresql:
sudo服务postgresql start
确保您没有与数据库的连接,否则它不会删除它。检查更多信息。结果中的哪个数字代表PID?我看到3个未标记的列,其数字看起来像PID。@BradGreens的第二列(我使用的是Mac Terminal)在ps中找不到任何东西,但仍然在db:drop上得到错误。您是否阅读过该生产警告?只是好奇:没有什么,但是你的gem可以做到——连接不存在(ps-grep搜索等),但是rails认为它存在。多谢!!
rake RAILS_ENV='test_server' db:drop db:create
ActiveRecord::StatementInvalid: PGError: ERROR: database <database_name> is being accessed by other users DROP DATABASE IF EXISTS <database_name>
# lib/tasks/kill_postgres_connections.rake
task :kill_postgres_connections => :environment do
  db_name = "#{File.basename(Rails.root)}_#{Rails.env}"
  sh = <<EOF
ps xa \
  | grep postgres: \
  | grep #{db_name} \
  | grep -v grep \
  | awk '{print $1}' \
  | xargs kill
EOF
  puts `#{sh}`
end

task "db:drop" => :kill_postgres_connections
sudo kill -9 `ps -u postgres -o pid` 
cmd = %(psql -c "SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE procpid <> pg_backend_pid();" -d '#{db_name}')
require 'active_record/connection_adapters/postgresql_adapter'
module ActiveRecord
  module ConnectionAdapters
    class PostgreSQLAdapter < AbstractAdapter
      def drop_database(name)
        raise "Nah, I won't drop the production database" if Rails.env.production?
        execute <<-SQL
          UPDATE pg_catalog.pg_database
          SET datallowconn=false WHERE datname='#{name}'
        SQL

        execute <<-SQL
          SELECT pg_terminate_backend(pg_stat_activity.pid)
          FROM pg_stat_activity
          WHERE pg_stat_activity.datname = '#{name}';
        SQL
        execute "DROP DATABASE IF EXISTS #{quote_table_name(name)}"
      end
    end
  end
end
# lib/tasks/databases.rake
def drop_database(config)
  raise 'Only for Postgres...' unless config['adapter'] == 'postgresql'
  Rake::Task['environment'].invoke
  ActiveRecord::Base.connection.select_all "select pg_terminate_backend(pg_stat_activity.pid) from pg_stat_activity where datname='#{config['database']}' AND state='idle';"
  ActiveRecord::Base.establish_connection config.merge('database' => 'postgres', 'schema_search_path' => 'public')
  ActiveRecord::Base.connection.drop_database config['database']
end
# config/initializers/postgresql_database_tasks.rb
module ActiveRecord
  module Tasks
    class PostgreSQLDatabaseTasks
      def drop
        establish_master_connection
        connection.select_all "select pg_terminate_backend(pg_stat_activity.pid) from pg_stat_activity where datname='#{configuration['database']}' AND state='idle';"
        connection.drop_database configuration['database']
      end
    end
  end
end
 rake db:drop
gem 'pgreset'
ENV=development

# restart postgresql
brew services restart postgresql

# get name of the db from rails app
RAILS_CONSOLE_COMMAND="bundle exec rails c -e $ENV"
DB_NAME=$(echo 'ActiveRecord::Base.connection_config[:database]' | $RAILS_CONSOLE_COMMAND | tail -2 | tr -d '\"')

# delete all connections to $DB_NAME
for pid in $(ps -ef | grep $DB_NAME | awk {'print$2'})
do
   kill -9 $pid
done

# drop db
DISABLE_DATABASE_ENVIRONMENT_CHECK=1 RAILS_ENV=$ENV bundle exec rails db:drop:_unsafe
sudo kill -9 `ps -u postgres -o pid=`
sudo systemctl start postgresql
rails db:drop RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1
  502   560   553   0 Thu08am ??         0:00.69 postgres: checkpointer process             
  502   565   553   0 Thu08am ??         0:00.06 postgres: bgworker: logical replication launcher
  502 45605   553   0  2:23am ??         0:00.01 postgres: st myapp_development [local] idle 
sudo kill -9 45605