[英]pg_dump and pg_restore (DROP IF EXISTS)
我想要一個完全基於 shell 的解決方案來測試我的數據庫,方法是允許我通過運行終端命令將其恢復到一致的 state。
我像這樣轉儲我的數據庫:
pg_dump -F c -b -f -i -h domain.edu -p 5432 -n myschema -U me mydatabase -W -f mydump.sql
然后我想像這樣恢復它:
pg_restore -h domain.edu -p 5432 -U me -d mydatabase -W mydump.sql
但它不起作用,因為我遇到了很多這樣的錯誤:
pg_restore: [archiver (db)] could not execute query: ERROR: constraint "settings_person_id_fkey" for relation "settings" already exists
Command was: ALTER TABLE ONLY settings
ADD CONSTRAINT settings_learner_id_fkey FOREIGN KEY (person_id) REFERENCES pe...
基本上只有一堆東西需要在重新添加之前先刪除( DROP TABLE <whatever> IF EXISTS
,與類型相同,等等)。
我怎樣才能用 Postgres 做到這一點? 我不想使用psql
控制台,只想使用 linux 終端。
如果您想將數據庫恢復到一致的狀態,我建議您在恢復轉儲之前刪除並重新創建它:
dropdb -h domain.edu -U me mydatabase
createdb -h domain.edu -U me -T template0 mydatabase # adjust encoding/locale if necessary
pg_restore -h domain.edu -p 5432 -U me -d mydatabase -W mydump.sql
您可以在 pg_dump 中使用--clean
來首先刪除對象:
pg_dump --clean
pg_dump --clean -U user database > database.sql
psql -U user -d database -f database.sql
恢復數據時可以使用--clean --if-exists
。
pg_restore -h domain.edu -p 5432 -U me --clean --if-exists -d mydatabase -W mydump.sql
--clean
使 pg_restore 首先drop
所有對象,而--if-exists
防止不存在的對象導致失敗。
請注意, --if-exists
沒有在pg_restore 的 postgres 文檔中作為單獨的選項列出,但在--clean
選項的描述中提到了它:
-c --clean
在重新創建數據庫對象之前清理(刪除)它們。 (除非使用 --if-exists,如果目標數據庫中不存在任何對象,這可能會生成一些無害的錯誤消息。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.