sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man ignorerar fel med psql \copy meta-kommando

Du kan inte hoppa över felen utan att hoppa över hela kommandot till och med Postgres 14. Det finns för närvarande ingen mer sofistikerad felhantering.

\copy är bara ett omslag runt SQL COPY som kanaliserar resultat genom psql. Manualen för COPY :

COPY stoppar driften vid det första felet. Detta bör inte leda till problem i händelse av en COPY TO , men måltabellen har redan tagit emot tidigare rader i en COPY FROM . Dessa rader kommer inte att vara synliga eller tillgängliga, men de upptar fortfarande diskutrymme. Detta kan innebära en ansenlig mängd bortkastat diskutrymme om felet inträffade långt in i en stor kopieringsoperation. Du kanske vill anropa VACUUM för att återvinna det bortkastade utrymmet.

Djärv betoning min. Och:

COPY FROM kommer att visa ett fel om någon rad i indatafilen innehåller fler eller färre kolumner än vad som förväntas.

COPY är ett extremt snabbt sätt att importera/exportera data. Sofistikerade kontroller och felhantering skulle sakta ner.

Det gjordes ett försök att lägga till felloggning till COPY i Postgres 9.0 men det blev aldrig begått.

Lösning

Fixa din inmatningsfil istället.

Om du har en eller flera ytterligare kolumner i din indatafil och filen är i övrigt konsekvent , kan du lägga till dummy-kolumner i tabellen isa och släpp dem efteråt. Eller (renare med produktionstabeller) importera till en temporär mellanställningstabell och INSERT valda kolumner (eller uttryck) till din måltabell isa därifrån.

Relaterade svar med detaljerade instruktioner:

  • Hur uppdaterar man valda rader med värden från en CSV-fil i Postgres?
  • COPY-kommandot:kopiera endast specifika kolumner från csv


  1. 5 sätt att få det korta månadsnamnet från ett datum i SQL Server

  2. Konfigurera SQL Server Alltid PÅ Tillgänglighetsgrupper mellan två synkrona repliker. Del 2

  3. Skript för att spara varbinära data på disken

  4. Hur man skriver till en CSV-fil med Oracle SQL*Plus