关于postgresql:Rails db:drop in postgres不起作用

Rails db:drop in postgres doesn't work

< BR>我在删除数据库中的表时遇到问题。我最近将数据库从sqlite改为postgres 9.3,我重新创建数据库的准备rake任务不起作用-db:drop不删除数据库,也没有到当前活动的postgres的连接(会话),日志中没有错误(with--trace on)。我的rake任务如下:

1
2
3
4
5
6
7
8
9
10
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

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

1
2
3
4
5
6
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

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

有人知道如何让它重新工作吗?事先谢谢。

编辑:
最后,我使用直接SQL删除表,但我不想使用特定于数据库的代码,因此我仍然对答案感兴趣,当前代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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


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

短期工作-运行rake db:rollback STEP=100

可能的原因?您的database.yml文件没有指定数据库。一定要添加default:development:您的postgres数据库:database: your_db_name

希望这能奏效…


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

要断开所有连接,请运行

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

参见:

如果有活动连接,如何删除PostgreSQL数据库?

为什么我不能成功地使用rake db:drop或rake db:purge?