Eu quero customizar meu monitor SQL pessoal escrevendo o arquivo .psqlrc, mas encontro alguns problemas.
--tablespace
skypcsuit=> \db
List of tablespaces
Name | Owner | Location
-------------------+----------+-----------------------------------------
pg_default | postgres |
pg_global | postgres |
tbs_db_francs | postgres | /database/pg92/pg_tbs/tbs_db_francs
tbs_skypcsuit | postgres | /database/pg92/pg_tbs/tbs_skypcsuit
tbs_skypcsuit_idx | postgres | /database/pg92/pg_tbs/tbs_skypcsuit_idx
--.psqlrc
\set top10_ts_table 'select relname, relkind, relpages,pg_size_pretty(pg_relation_size(a.oid)),reltablespace,relowner from pg_class a, pg_tablespace tb where a.relkind in (\'r\', \'i\') and a.reltablespace=tb.oid and tb.spcname=\':v_spcname\' order by a.relpages desc limit 10;'
--chamar o sql mas retornar valor nulo
skypcsuit=> \set v_spcname tbs_skypcsuit_idx
skypcsuit=> \echo :v_spcname
tbs_skypcsuit_idx
skypcsuit=> :top10_ts_table
relname | relkind | relpages | pg_size_pretty | reltablespace | relowner
---------+---------+----------+----------------+---------------+----------
(0 rows)
Eu defino o valor da variável v_spcname como 'tbs_skypcsuit_idx'。
-- csvlog
2014-07-24 01:10:00.091 PDT,"skypcsuit","skypcsuit",2123,"[local]",53d0bf4c.84b,3,"idle",2014-07-24 01:09:48 PDT,2/94,0,LOG,00000,"statement: select relname, relkind, relpages,pg_size_pretty(pg_relation_size(a.oid)),reltablespace,relowner from pg_class a, pg_tablespace tb where a.relkind in ('r', 'i') and a.reltablespace=tb.oid and tb.spcname=':v_spcname' order by a.relpages desc limit 10;",,,,,,,,,"psql"
Pelo log podemos ver que os valores da variável v_spcname não passaram para o sql. alguem sabe disso?
Usar
psql
variáveis com aspas é um pouco complicado. Como você notou, eles não são substituídos em certas posições, entre outras, entre aspas.Minha única solução para isso até agora foi incluir a citação na própria variável. Isso também não é muito simples:
e assim por diante. Isso é, a meu ver, basicamente o mesmo que a mágica de duplicação de citações em outro lugar (mencionada mais de uma vez na documentação).
A solução que postei no comentário é basicamente uma versão feia da versão de três aspas.
Observe que a cotação do dólar não funciona aqui: