COPY är inte avsedd för detta. Det är tänkt att hantera tabellstrukturerade data, så det kan inte fungera utan något sätt att dela upp rader och kolumner; det kommer alltid att finnas några tecken som COPY FROM tolkas som separatorer, och för vilka COPY TO kommer att infoga någon escape-sekvens om den hittar en i dina data. Det här är inte bra om du letar efter en allmän fil-I/O-funktion.
Faktum är att databasservrar inte är designade för allmän fil I/O. För det första, vad som helst som interagerar direkt med serverns filsystem kräver en superanvändarroll. Om det alls är möjligt bör du bara fråga tabellen som vanligt och hantera filens I/O på klientsidan.
Som sagt, det finns några alternativ:
- Den inbyggda
pg_read_file()funktion ochpg_file_write()frånadminpackmodul, ger det mest direkta gränssnittet till filsystemet, men de är båda begränsade till klustrets datakatalog (och jag skulle inte rekommendera att lagra slumpmässiga användarskapade filer där). lo_import()ochlo_export()är de enda inbyggda funktioner jag känner till som direkt handlar om fil-I/O och som har obegränsad åtkomst till serverns filsystem (inom de begränsningar som värdoperativsystemet ställer), men Large Object-gränssnittet är inte speciellt användarvänligt ....- Om du installerar den opålitliga varianten av ett procedurspråk som Perl (
plperlu) eller Python (plpythonu), kan du skriva omslagsfunktioner för det språkets ursprungliga I/O-rutiner. - Det finns inte mycket du inte kan åstadkomma med
COPY TO PROGRAMom du är tillräckligt beslutsam - för en, kan duCOPY (SELECT 1) TO PROGRAM 'mv <source_file> <target_file>'för att kringgå begränsningarna förpg_file_write()- även om detta suddar ut gränsen mellan SQL och externa verktyg något (och den som ärver din kodbas kommer förmodligen inte att bli imponerad...).