Postgres-asiakasohjelman kopio (\ copy) -komennolla ' ei ole pääsyä väliaikaiseen taulukkoon?

Luon SQL-komentojen luettelon viedäni joitain tietoja, jotka viime kädessä suoritan psql -f: n avulla. Kaikki kyselyt saavat saman tietojoukon, Luulin, että laskisin pätevyydet pois ja laitoin luettelon kelvollisista käyttäjätunnuksista väliaikaisiin taulukoihin, kuten

create temporary table tmp_export_users as (select id from users where ...) 

ja palaan sitten takaisin \ copy -komennot, kuten

\copy (select ... from table where user_id in (select id from tmp_export_users)) TO "filename.csv" WITH CSV HEADER 

Ne kaikki ovat samassa tiedostossa, yksi riviä kohden, ja niiden suorittaminen -f saan virheen, jonka kopiointikomennot voivat tehdä ” Älä näe väliaikaista taulukkoa, joten arvaan, että asiakaskopiointikomento ei todellakaan saa käyttää samaa postgres-istuntoa kuin psql.

Onko se oikein? Onko mahdollista muuttaa tätä käyttäytymistä?

Vastaa

\copy voi käyttää väliaikaista taulukkoa.

Ensin testasin ja vahvistin tämän versiolla 9.0 komentorivillä.
Sitten loin tiedoston, jossa oli SQL- ja psql-metakomento \copy käyttäen useita väliaikaisia taulukoita. Se toimi myös minulle.

CREATE TEMP TABLE tmp as SELECT * FROM tbl; \copy (SELECT * FROM tmp JOIN tbl USING (id)) TO "/var/lib/postgres/test1.csv"; 

Soita:

psql -p5432 mydb -f test.sql 

Huomaa päättävä puolipiste, joka on valinnainen tiedoston lopussa (lopetettu implisiittisesti), mutta vaaditaan minkä tahansa muun SQL-käskyn jälkeen ja myös viimeisen jälkeen, jos se suoritetaan vuorovaikutteisesti psql: ssä.

Normaalisti , psql-metakomentoja ei voida sekoittaa SQL -riville tiedostossa, joka suoritetaan per psql -f. Lainaan psql: n -käsikirjaa:

Argumenttien jäsentäminen loppuu viiva tai kun löydetään toinen noteeraamaton vinoviiva. Lausimaton taaksepäin viiva otetaan uuden metakomennon alkuun. Erityinen sekvenssi \\ (kaksi taaksepäin viivaa) merkitsee argumenttien lopun ja jatkaa mahdollisten SQL-komentojen jäsentämistä. Näin SQL- ja psql-komennot voidaan sekoittaa vapaasti rivillä. Mutta joka tapauksessa metakomennon argumentit eivät voi jatkua rivin loppupuolella.

Erilaisia sääntöjä sovelletaan jälkeen \copy. Pohjimmiltaan psql siirtyy takaisin SQL-tilaan automaattisesti \copy jälkeen: Katso:

Mutta kirjoitit, että sinulla oli kaikki komennot erillisillä riveillä. Joten tämä ei voi olla selitys tapauksessasi.


Kaikki tämä paitsi, oletko harkinnut COPY ( SQL-komento ) \copy ( psql-metakomento )?

Tietysti kohdetiedoston on oltava paikallinen palvelimelle ei tässä tapauksessa asiakas. Ja erilaiset tiedosto-oikeudet ovat voimassa. Opas :

Tiedostot, joiden nimi on COPY -komennon lukee tai kirjoittaa suoraan palvelin, ei asiakassovellus. Siksi heidän on asuttava tietokantapalvelimen koneessa tai oltava niiden käytettävissä, ei asiakkaan. Niiden on oltava PostgreSQL-käyttäjän (käyttäjätunnus, jolla palvelin toimii), ei asiakkaan, oltava luettavissa tai kirjoitettavissa.

Kommentit

  • kopio suoritetaan postgres-käyttäjänä, \ copy wraps kopioi, jotta voit kirjoittaa vakiotiedostoon ja sinut ohjataan tiedostoon, johon lähetät sen. Voit myös soittaa psql-tiedostoon, lähettää tuotoksen tiedostoon \ o: lla ja suorittaa sitten kopion stdout-tiedostoon saadaksesi samanlaisen vaikutuksen.
  • Varmistaakseni, että suoritin testin vastauksessani pääkäyttäjällä (postgres ) ja nuken käyttäjä. Molemmat toimivat minulle. Samat tulokset versiossa v8.4.
  • Joo, onko postgres unix -käyttäjällä pääsy esimerkiksi / tmp: hen, riippuu esimerkiksi siitä, onko SELinux asennettu vai ei, päästääkö se sen laatikosta. \ Copy tai copy to stdout ovat ehdottomasti kaksi luotettavampaa tapaa käyttää kopiota.
  • Kiitos vastauksista kaikille. Näyttää siltä, että olen laiminlyönyt lopettaa rivin, joka loi väliaikaisen taulukon puolipisteellä, joten sitä ei luotu '. Toimii odotusten mukaisesti nyt

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *