Nevím, kde jsi vzal tu syntaxi, ale COPY
nebere takový seznam aliasů sloupců. Viz nápověda:
COPY table_name [ ( column_name [, ...] ) ]
FROM { 'filename' | PROGRAM 'command' | STDIN }
[ [ WITH ] ( option [, ...] ) ]
(AS
není jednou z uvedených možností; pro zobrazení celého výstupu spusťte \d copy
v psql nebo se podívejte do manuálu pro copy
příkaz online).
COPY
neobsahuje žádné mapovací zařízení to vám umožní číst pouze některé sloupce vstupního CSV. Bylo by to opravdu užitečné, ale nikdo ještě neměl čas/zájem/finance to implementovat. Je to opravdu jen jedna z mnoha úloh transformace/filtrování dat, kterou lidé stejně chtějí.
PostgreSQL očekává seznam sloupců uvedený v COPY
být ve stejném pořadí, zleva doprava, jako v souboru CSV, a mít stejný počet záznamů, jako má soubor CSV. Pokud tedy napíšete:
COPY con (date,kgs)
poté bude PostgreSQL očekávat vstupní CSV s přesně dvěma sloupci . Pro "date"
použije první sloupec csv sloupec tabulky a druhý sloupec csv pro "kgs"
sloupec tabulky. Nezáleží na tom, jaká jsou záhlaví CSV, budou ignorována, pokud zadáte WITH (FORMAT CSV, HEADER ON)
, nebo považovány za normální datové řádky, pokud nezadáte HEADER
.
PostgreSQL 9.4 přidává FROM PROGRAM
COPY
, takže byste mohli spustit příkaz shellu k načtení souboru a jeho filtrování. Jednoduchý skript v Pythonu nebo Perlu by to udělal.
Pokud se jedná o malý soubor, stačí otevřít kopii v tabulce dle vašeho výběru jako soubor csv, odstranit nežádoucí sloupce a uložit jej, takže pouze date
a kgs
sloupce zůstanou.
Případně COPY
do pracovní tabulky, která má všechny stejné sloupce jako CSV
a poté proveďte INSERT INTO ... SELECT
přenést pouze požadovaná data do skutečné cílové tabulky.