Mám ladicí zprávy ve funkcích. Tyto zprávy jsou vyvolány jako
RAISE NOTICE 'Value of id : %', id;
Soubor protokolu jsem nastavil pomocí \o messages.txt
Pak udělám, co musím udělat s \i process.sql
A když je provádění ukončeno, \o
.
Problém je v tom, že nemám zprávy vyvolávané upozorněními do messages.txt. Zprávy se zobrazují na obrazovce, ale chci, aby byly zapsány do souboru messages.txt
Jak bych to mohl udělat?
Snažil jsem se použít RAISE LOG...
a zprávy jsou zapsány do souboru protokolu ... To není to, co chci.
Mám tu práci
plsql -f /path/to/process.sql > messages.txt 2>&1
ale rád bych věděl, jak mohu použít\i a\o na plsql klientovi, který má zprávy do souboru uvedeného v\o
Můj klient, na cygwin, je psql (PostgreSQL) 8.2.11 a verze serveru je 9.0.7
Obávám se, že se vám tato odpověď nebude líbit, ale v současné době se to zdá nemožné. Z dokumentace psql :
Uloží budoucí výsledky dotazů do souboru název souboru nebo rozdělí budoucí výsledky do samostatného prostředí Unix Shell k provedení příkazu. Pokud nejsou zadány žádné argumenty, výstup dotazu bude resetován na standardní výstup.
"Výsledky dotazu" zahrnují všechny tabulky, odpovědi na příkazy a upozornění získaná z databázového serveru, jakož i výstup různých příkazů zpětného lomítka, které dotazují databázi (například\d), ale nikoli chybové zprávy.
A jak jste si všimli, při interaktivním použití psql
neexistuje způsob přesměrování chybových zpráv.
(Hrál jsem se všemi druhy přesměrování z\na bezvýsledně. Vypadá to, že výstupní kanál dotazu se liší od toho, který zobrazuje chybové zprávy - a dokonce i chyby ze serveru a vyvolané ve vašich postupech jdou různými způsoby .
test=# SHOW client_min_messages;
client_min_messages
---------------------
notice
-- added the above to show it's not a config problem
CREATE FUNCTION raise_test() RETURNS integer AS
$body$
BEGIN
RAISE NOTICE 'notice';
RETURN 1;
END;
$body$
LANGUAGE plpgsql;
test=# \o | cat > out.sql
test=# SELECT raise_test(); -- you could put this in a file and call \i your_file, it's just the same
NOTICE: notice
test=# \o | cat > out.sql 2>&1
test=# SELECT raise_test();
NOTICE: notice
out.sql obsahuje
raise_test
------------
1
(1 row)
v obou případech. To je důvod, proč jsem bezradný ohledně toho, jaký deskriptor kanálu/souboru se používá pro výstup zpráv získaných z procedury.))
(Na hackerech PostgreSQL je vlákno, které může v tomto problému vrhnout nějaké světlo: http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )
Co by se dalo udělat, je začít psql
like
psql test >/tmp/psql.out 2>&1
a to přesměruje veškerý výstup do zadaného souboru. Jediný problém s tím, že nemáte ani výzvu, a ztratíte schopnosti úprav příkazového řádku.
Můžeme spustit příkaz Shell přímo z psql pomocí \!
meta příkaz.
localhost: 5432 uživatel @ db = # \! psql -U user -h localhost your_database -e 'select your_function_name ()'> debug.txt 2> & 1
otevřeno debug.txt
s \e
.
localhost: 5432 uživatel @ db = #\e debug.txt
zpráva vyvolání se zobrazí ve výchozím editoru. trochu komplikovaný, stále docela užitečný pro milence CommandLine.
Následující text jako boostTest.sql
BEGIN;
CREATE FUNCTION count_to_hundred() RETURNS VOID AS
$_$
BEGIN
FOR i IN 1..100
LOOP
RAISE NOTICE '%', i;
END LOOP;
RETURN;
END;
$_$
LANGUAGE plpgsql;
SELECT count_to_hundred();
ROLLBACK;
Nejsem si jistý, proč zápis výstupu do souboru, jak je uvedeno v OP, nefunguje, ale jeho vložení do odpaliště skutečně vyšlo:
psql -f raiseTest.sql 2>&1 | tee messages.txt
Tee zapíše stdin do jednoho nebo více souborů a zpět do stdout. Takže budete mít všechny příkazy RAISE ve své konzoli a v zadaných souborech. (srov. tee's man page )
Konfigurace: