Postgresql

如何以“Insert … on conflict”格式而不是“cp”格式導出 Postgres 數據?

  • January 22, 2017

我在 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 選項對列順序更改是安全的,儘管速度更慢。

例如,假設您使用myhostand mydb

我們創建並填充一張表(在一個模式中):

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.

恢復過程產生了一個錯誤(表中已經存在的行),但確實插入了其餘數據。

儘管這不是您所要求的,但出於所有實際目的,您可以實現您正在尋找的結果。

引用自:https://dba.stackexchange.com/questions/159196