Rails db:postgres中的drop不起作用

时间:2015-01-24 16:50:31

标签: ruby-on-rails postgresql activerecord rake


我在数据库中删除表时遇到了麻烦。我最近将数据库从SQLite更改为Postgres 9.3并且我的重新创建数据库的rake任务没有工作 - db:drop不会丢弃数据库,也没有与当前活动的postgres没有连接(会话)而且没有日志中的错误(使用--trace)。我的rake任务看起来像这样:

task prepare_all: :environment do
    puts "==== PREPARING DATABASE ===="
    Rake::Task["db:drop"].invoke()
    Rake::Task["db:create"].invoke()
    Rake::Task["db:migrate"].invoke()
    Rake::Task["db:populate"].invoke()
    Rake::Task["db:codetables_populate"].invoke()
    Rake::Task["db:geocode"].invoke()
    puts "==== DATABASE PREPARED ===="
end

但它失败了,因为数据库没有被删除,数据仍然存在,当我填充数据库时,由于电子邮件验证(电子邮件已经存在),它首次插入失败。当我尝试manualy运行任务db:drop with trace时,输出如下:

bundle exec rake db:drop RAILS_ENV=development --trace
DL is deprecated, please use Fiddle
** Invoke db:drop (first_time)
** Invoke db:load_config (first_time)
** Execute db:load_config
** Execute db:drop

当我查看数据库时,所有表都充满了数据。我正在使用Postgres 9.3(在Windows 7上)。在将数据库更改为Postgres之后不会立即发生此行为,它最初工作,但我尝试手动编辑现有的迁移文件(并更改其名称以强制执行它们)并且所有数据都停止工作。 当我手动删除表时,任务完成,但第二次...当然再次失败,因为db:drop什么都不做。

有没有人知道如何让它再次运作?提前谢谢。

修改
最后我最终使用直接SQL删除表,但我不想使用特定于DB的代码,所以我仍然对答案感兴趣,当前代码:
< / p>

task prepare_all: :environment do
    puts "==== PREPARING DATABASE ===="
    # Rake::Task["db:drop"].invoke()
    ActiveRecord::Base.connection.execute("DROP SCHEMA public CASCADE;
                                           CREATE SCHEMA public;
                                           GRANT ALL ON SCHEMA public TO postgres;
                                           GRANT ALL ON SCHEMA public TO public;
                                           COMMENT ON SCHEMA public IS 'standard public schema';") 
    Rake::Task["db:create"].invoke()
    Rake::Task["db:migrate"].invoke()
    Rake::Task["db:populate"].invoke()
    Rake::Task["db:codetables_populate"].invoke()
    Rake::Task["db:geocode"].invoke()
    puts "==== DATABASE PREPARED ===="
  end

2 个答案:

答案 0 :(得分:3)

我在快速创建新的rails项目后最近遇到了这个问题。

简短的解决方法 - 运行rake db:rollback STEP=100

可能的原因?您的database.yml文件未指定数据库。请务必添加default:development:您的postgres数据库:database: your_db_name

希望这有效......

答案 1 :(得分:0)

Postgres不允许您在仍有活动连接的情况下删除数据库。

要断开所有连接,请运行

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE datname = current_database()
  AND pid <> pg_backend_pid();

另见:

How to drop a PostgreSQL database if there are active connections to it?

Why can't I successfully use rake db:drop or rake db:purge?