sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan eksporterer man fuldtekstfiler med SQL?

COPY er ikke designet til dette. Det er beregnet til at håndtere tabelstrukturerede data, så det kan ikke fungere uden en måde at opdele rækker og kolonner på; der vil altid være nogle tegn, som COPY FROM fortolkes som separatorer, og for hvilke COPY TO vil indsætte en escape-sekvens, hvis den finder en i dine data. Dette er ikke fantastisk, hvis du leder efter en generel fil I/O-facilitet.

Faktisk er databaseservere ikke designet til generel fil I/O. For det første hvad som helst som interagerer direkte med serverens filsystem vil kræve en superbrugerrolle. Hvis det overhovedet er muligt, bør du bare forespørge i tabellen som sædvanligt og håndtere filen I/O på klientsiden.

Når det er sagt, er der et par alternativer:

  • Den indbyggede pg_read_file() funktion, og pg_file_write() fra adminpack modul, giver den mest direkte grænseflade til filsystemet, men de er begge begrænset til klyngens datamappe (og jeg vil ikke anbefale at gemme tilfældige brugeroprettede filer der).
  • lo_import() og lo_export() er de eneste indbyggede funktioner, jeg kender til, som omhandler fil-I/O og som har ubegrænset adgang til serverens filsystem (inden for de begrænsninger, host-OS'en pålægger), men Large Object-grænsefladen er ikke særlig brugervenlig ....
  • Hvis du installerer den upålidelige variant af et proceduresprog som Perl (plperlu ) eller Python (plpythonu ), kan du skrive indpakningsfunktioner til det sprogs oprindelige I/O-rutiner.
  • Der er ikke meget, du ikke kan opnå via COPY TO PROGRAM hvis du er beslutsom nok - for én, kan du COPY (SELECT 1) TO PROGRAM 'mv <source_file> <target_file>' at omgå begrænsningerne for pg_file_write() - selvom dette udvisker grænsen mellem SQL og eksterne værktøjer noget (og den, der arver din kodebase, vil sandsynligvis ikke blive imponeret...).


  1. Hvordan bruger man en liste som en parameterkilde til SQL-forespørgsler med Vertx JDBC Client?

  2. Besynderlig tidszonehåndtering i en Postgres-database

  3. svarende til parallel forespørgsel af ORACLE i mysql

  4. LAST_INSERT_ID() er ulig med $db->insert_id?