我在数据库中删除表时遇到了麻烦。我最近将数据库从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
答案 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?