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项目之后,我最近遇到了这个问题。
短期工作-运行
可能的原因?您的database.yml文件没有指定数据库。一定要添加
希望这能奏效…
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?