Díky! J.--
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „PostgreSQL-cz“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu postgresql-c...@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/postgresql-cz/CA%2B8wVNVre4t-Ff48dKGswfrOeRXDc41M0rrN1tv%3D9r1Zq8_%2BCg%40mail.gmail.com.
Ahoj,
--
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „PostgreSQL-cz“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu postgresql-c...@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/postgresql-cz/CA%2B8wVNVre4t-Ff48dKGswfrOeRXDc41M0rrN1tv%3D9r1Zq8_%2BCg%40mail.gmail.com.
\copy je záležitost psql, kdežto COPY se děje na servru, to \copy udělá v psql COPY FROM STDIN (to uvidíš v pg_stat_activity). Tj, budeš to ukládat pod svym uživatelem na stroji, kde ti běží psql, nikoliv na serveru, jako při použití copy, kde to běží ṕod uživatelem postgres. Já mám za to, že metacommandy nedovedou použít proměnné psql a tohle takhle na přímo udělat nejde. Tj musíš si upravit rovnou to sql, buď sedem, nebo přes eval, nebo použít HEREDOC.
matacommandy umi pouzivat promenne psql, jen je pruser nebo omezeni (castecne z duvodu bezpecnosti), ze evaluace psql promennych neni rekurzivni(2022-04-22 10:39:53) postgres=# \set var 'Pavel'
(2022-04-22 10:48:59) postgres=# \echo :var
Pavel\copy zavola hlavni parser, a transformuje \copy na COPY. problem je, ze ten hlavni parser nezna psql promenne - syntax :xxx neni SQL a parsuje se postupne - neni to tak, ze by se parsoval cely radek a pak by se zavolal treba sql parser uz na radku se substituovanymi parametry - coz je mozna v tomhle pripade chyba
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/postgresql-cz/CAAYBy8byYTpPORytYZ%2BahFttNc5s_QwBHR3uw0z0wXs55vkqLA%40mail.gmail.com.
--
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „PostgreSQL-cz“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu postgresql-c...@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/postgresql-cz/CAFj8pRCZK20m9T8zEHMc5NUo0f8_NoDxAJtwt6kTBaKgu6L77w%40mail.gmail.com.
Ahojpá 22. 4. 2022 v 10:26 odesílatel Jiří Fejfar <juraf...@gmail.com> napsal:Ahoj,
podle https://stackoverflow.com/a/18730455 používám kód, který vezme z proměnné prostředí název souboru a použije ho v příkazu COPY (SQL verze) viz https://gitlab.com/nfiesta/nfiesta_sdesign/-/blob/main/extension/sql/csv/create_csv.sql#L15.
V principu něco takového:
...
\set afile :outputdir '/a.csv'
COPY (SELECT * FROM a) TO :'afile';
jelikož mám problém s právy k zápisu souboru, potřeboval bych to samé udělat pro \COPY (psql verze) ale dostávám chyby:
\COPY (SELECT * FROM a) TO :afile;
to prostě zapíše do souboru s názvem :afile místo použití té proměnné
\COPY (SELECT * FROM a) TO :'afile';
psql:sql/csv/create_csv.sql:15: ERROR: syntax error at or near "'afile'"
LINE 1: COPY ( SELECT * FROM a) TO STDOUT 'afile' DELIMI...
díval jsem se na https://stackoverflow.com/a/51682445 ale stejně nevím, jak na to? Je někde zdokumentováno jak funguje přesně to \COPY?tohle si myslim, ze najdes jedine ve zdrojacich psql ka. \copy je fakticky COPY FROM/TO stdin/stdout.a dost mozna, ze tam bude jeste nejaka certovina, ze se pro i pro \copy pouziva SQL parser, ktery nerozezna psql promenne :-/tady mne napadl takovy trik - pseudo dynamicke sql\set file ~/xx\set cmd '\\copy (select 1) to ':file:cmd
Jinak je to v podstate buga psql, a zkus to fixnout. Jestli to pujde. Bylo by hezky, kdyby to fungovalo. Tam si myslim, ze bude nejaky problem ve volani externiho parseru
Pavel
--Díky! J.--
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „PostgreSQL-cz“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu postgresql-c...@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/postgresql-cz/CA%2B8wVNVre4t-Ff48dKGswfrOeRXDc41M0rrN1tv%3D9r1Zq8_%2BCg%40mail.gmail.com.
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „PostgreSQL-cz“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu postgresql-c...@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/postgresql-cz/CAFj8pRC-_n-Xyvey2v-wmTr7k8s8X79bxabgwgveXYomtGs7HA%40mail.gmail.com.
On Fri, 22 Apr 2022 at 10:45, Pavel Stehule <pavel....@gmail.com> wrote:Ahojpá 22. 4. 2022 v 10:26 odesílatel Jiří Fejfar <juraf...@gmail.com> napsal:Ahoj,
podle https://stackoverflow.com/a/18730455 používám kód, který vezme z proměnné prostředí název souboru a použije ho v příkazu COPY (SQL verze) viz https://gitlab.com/nfiesta/nfiesta_sdesign/-/blob/main/extension/sql/csv/create_csv.sql#L15.
V principu něco takového:
...
\set afile :outputdir '/a.csv'
COPY (SELECT * FROM a) TO :'afile';
jelikož mám problém s právy k zápisu souboru, potřeboval bych to samé udělat pro \COPY (psql verze) ale dostávám chyby:
\COPY (SELECT * FROM a) TO :afile;
to prostě zapíše do souboru s názvem :afile místo použití té proměnné
\COPY (SELECT * FROM a) TO :'afile';
psql:sql/csv/create_csv.sql:15: ERROR: syntax error at or near "'afile'"
LINE 1: COPY ( SELECT * FROM a) TO STDOUT 'afile' DELIMI...
díval jsem se na https://stackoverflow.com/a/51682445 ale stejně nevím, jak na to? Je někde zdokumentováno jak funguje přesně to \COPY?tohle si myslim, ze najdes jedine ve zdrojacich psql ka. \copy je fakticky COPY FROM/TO stdin/stdout.a dost mozna, ze tam bude jeste nejaka certovina, ze se pro i pro \copy pouziva SQL parser, ktery nerozezna psql promenne :-/tady mne napadl takovy trik - pseudo dynamicke sql\set file ~/xx\set cmd '\\copy (select 1) to ':file:cmdjo, toto funguje, ale nevím zase jak tam dostat ten DELIMITER a CVS HEADER :-) zkoušel jsem to přilepit třeba v dalším \set ale nejede to... nerozumím ještě tomu kde je problém, v těch parserech
\copy
meta-command. Unlike most other meta-commands, the entire remainder of the line is always taken to be the arguments of \copy
, and neither variable interpolation nor backquote expansion are performed in the arguments. COPY ... TO STDOUT
command and terminate it with \g filename