我想通过编写 .psqlrc 文件来自定义我的个人监视器 sql,但是我遇到了一些问题。
--表空间
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;'
--调用sql但返回空值
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)
我将变量v_spcname的值设置为'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"
从日志中我们可以看到变量v_spcname的值没有传递给 sql。有人知道吗?
使用
psql
带引号的变量有点棘手。正如您所注意到的,它们不会在某些位置被替换,尤其是在引号之间。到目前为止,我唯一的解决方案是在变量本身中包含引号。这也不是很简单:
等等。在我看来,这与其他地方的引用复制魔术基本相同(在文档中不止一次提到)。
我在评论中发布的解决方案基本上是三引号版本的丑陋版本。
请注意,美元报价在这里不起作用: