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ånadminpack
modul, 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 PROGRAM
om 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...).