簡體   English   中英

Rails db:drop在postgres中不起作用

[英]Rails db:drop in postgres doesn't work


我在刪除數據庫中的表時遇到麻煩。 我最近將數據庫從SQLite更改為Postgres 9.3,並且重新創建數據庫的准備rake任務不起作用-db:drop不會刪除數據庫,也沒有與當前活動的postgres的連接(會話),並且沒有錯誤日志(啟用--trace)。 我的瑞克任務看起來像這樣:

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

但是它失敗了,因為沒有刪除數據庫,數據仍然存在,並且當我填充數據庫時,由於電子郵件驗證(電子郵件已經存在)而導致第一次插入失敗。 當我嘗試使用跟蹤手動運行任務db:drop時,輸出如下:

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刪除表,但是我不想使用特定於數據庫的代碼,因此我對當前的答案仍然很感興趣:

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:添加default:development: postgres數據庫: database: your_db_name

希望這可以...

當仍然有活動的連接時,Postgres將不允許您刪除數據庫。

要斷開所有連接,請運行

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?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM