Postgresql
如何以“Insert … on conflict”格式而不是“cp”格式導出 Postgres 數據?
我在 Mac Sierra 上使用 Postgres 9.5。我想從我的本地數據庫中導出一些記錄並將它們導入到 Linux 機器上的數據庫中(也執行 PostGres 9.5)。我正在使用此命令從本地機器導出數據……
localhost:myproject davea$ pg_dump -U myproject mydb -a -t table1 -t table2 -t table3 > /tmp/pgdata.sql
數據以一系列複製命令導出。有沒有辦法導出表數據,使文件有一堆“INSERT … ON CONFLICT DO NOTHING;” 陳述?原始數據庫和目標數據庫中有一些重複,但我不希望這會破壞非重複數據的導入。
pg_dump
不會讓你完全按照你的要求做,但你有一個可能足夠好的選擇。根據pg_dump 的文件,您可以--inserts
選擇:–插入
將數據轉儲為 INSERT 命令(而不是 COPY)。這將使恢復非常緩慢;它主要用於製作可以載入到非 PostgreSQL 數據庫的轉儲。**但是,由於此選項為每一行生成一個單獨的命令,因此重新載入行時的錯誤只會導致該行失去,而不是整個表內容。**請注意,如果您重新排列了列順序,還原可能會完全失敗。–column-inserts 選項對列順序更改是安全的,儘管速度更慢。
例如,假設您使用
myhost
andmydb
。我們創建並填充一張表(在一個模式中):
CREATE SCHEMA s1 ; CREATE TABLE s1.t1 ( id serial PRIMARY KEY, column_1 text, column_2 text ) ; INSERT INTO s1.t1 (column_1, column_2) VALUES ('Some value', 'and another one'), ('Again some value', 'and some more') ;
在這一點上,我們備份它:
pg_dump --host myhost --format custom --section data --inserts --verbose --file "t1.backup" --table "s1.t1" "mydb"
備份後,我們刪除了表中的一行,但我們仍然保留了一行:
DELETE FROM s1.t1 WHERE id = 1 ;
此時,我們確實恢復了備份(這是您通常在第二個數據庫上執行的操作),並收到以下消息:
pg_restore --host myhost --dbname "mydb" --section data --data-only --table t1 --schema s1 --verbose "t1.backup" pg_restore: connecting to database for restore pg_restore: processing data for table "s1.t1" pg_restore: [archiver (db)] Error while PROCESSING TOC: pg_restore: [archiver (db)] Error from TOC entry 2759; 0 21286 TABLE DATA t1 postgres pg_restore: [archiver (db)] could not execute query: ERROR: duplicate key value violates unique constraint "t1_pkey" DETAIL: Key (id)=(2) already exists. Command was: INSERT INTO t1 VALUES (2, 'Again some value', 'and some more'); pg_restore: setting owner and privileges for TABLE DATA "s1.t1" WARNING: errors ignored on restore: 1 Process returned exit code 1.
恢復過程產生了一個錯誤(表中已經存在的行),但確實插入了其餘數據。
儘管這不是您所要求的,但出於所有實際目的,您可以實現您正在尋找的結果。