是否有可能以某种方式在psql中创建别名(如Unix alias
命令)?
我的意思是,不是SQL FUNCTION,而是本地别名以简化手动查询?
答案 0 :(得分:11)
我不知道任何可能性。基于 psql 变量的 psql 只有解决方法,但有很多限制 - 使用这些查询的参数很困难。
postgres=# \set whoami 'SELECT CURRENT_USER;'
postgres=# :whoami
current_user
--------------
pavel
(1 row)
答案 1 :(得分:3)
Pavel的答案几乎是正确的,除了你可以用另一种方式使用参数。
之后
\set s 'select * from '
\set l ' limit 10;'
以下命令
:s agent :l
将等于
select * from agent limit 10;
根据http://www.postgresql.org/docs/9.0/static/app-psql.html
如果不带引号的参数以冒号(:)开头,则将其视为psql 变量和变量的值用作参数 代替。如果变量名称被单引号括起来(例如 :' var'),它将作为SQL文字进行转义,结果将是 用作参数。如果变量名称被double包围 引号,它将作为SQL标识符进行转义,结果将是 用作论据。
您也可以使用反引用来运行shell命令
反引号(`)中包含的参数被视为命令 传递给shell的行。命令的输出(带有任何 将删除的尾随换行符)作为参数值。以上 转义序列也适用于反引号。
答案 2 :(得分:1)
如何使用UDF?您可以创建一个返回表(一组)的UDF,然后您可以将其查询为:select * from udf();
它不是那么干净,但它总比没有好,而且便携。 UDF也可以采用参数。
答案 3 :(得分:1)
为什么不使用视图?可能views会对你的情况有帮助。
答案 4 :(得分:0)
如果您需要从命令行(而不是psql cli)运行频繁的查询,这可能会有所帮助。
将此添加到.bash_profile
/ .bashrc
POSTGRES_BIN=~/Postgres/bin
B_RED='\033[1;31m'
RESET='\033[0m'
psqlcommand="$POSTGRES_BIN/psql -U vignesh usersdb -q -c"
function psqlselectrows()
{
[ -z "$1" ] && echo -e "${B_RED}Argument 1 missing: Need table name${RESET}" ||
$psqlcommand "SELECT * from $1"
}
上面的命令从表中选择在参数中传递的行。
注意:
~/.psqlrc
文件中添加以下行。 SET SEARCH_PATH TO <schema_name>;
如果有帮助,我已经做了一些命令供我使用。
(以上所有命令都需要表名作为第一个参数)
#Colors
B_RED='\033[1;31m'
B_GREEN='\033[1;32m'
B_YELLOW='\033[1;33m'
RESET='\033[0m'
#Postgres Command With Params
psqlcommand="$POSTGRES_BIN/psql -U vignesh usersdb -q -c"
function psqlgettablesize()
{
[ -z "$1" ] && echo -e "${B_RED}Argument 1 missing: Need table name${RESET}" ||
$psqlcommand "select pg_size_pretty(pg_total_relation_size('$1')) as total_table_size, pg_size_pretty(pg_relation_size('$1')) as table_size, pg_size_pretty(pg_indexes_size('$1')) as index_size;";
}
function psqlgettablecount()
{
[ -z "$1" ] && echo -e "${B_RED}Argument 1 missing: Need table name${RESET}" ||
$psqlcommand "select count(*) from $1;"
}
function psqlgetvacuumdetails()
{
[ -z "$1" ] && echo -e "${B_RED}Argument 1 missing: Need table name${RESET}" ||
$psqlcommand "SELECT relname, n_live_tup, n_dead_tup, last_analyze::timestamp, analyze_count, last_autoanalyze::timestamp, autoanalyze_count, last_vacuum::timestamp, vacuum_count, last_autovacuum::timestamp, autovacuum_count FROM pg_stat_user_tables where relname='$1' and schemaname = current_schema();"
}
function psqltruncatetable()
{
[ -z "$1" ] && echo -e "${B_RED}Argument 1 missing: Need table name${RESET}" ||
{
read -p "$(echo -e ${B_YELLOW}"Are you sure to truncate table '$1' (y/n)? "${RESET})" choice
case "$choice" in
y|Y ) $psqlcommand "TRUNCATE $1;";;
n|N ) echo -e "${B_GREEN}Table '$1' not truncated${RESET}";;
* ) echo -e "${B_RED}Invalid option${RESET}";;
esac
}
}
function psqlsettings()
{
query="select * from pg_settings"
if [ "$1" != "" ]; then
query="$query where category like '%$1%'"
fi
query="$query ;"
$psqlcommand "$query"
if [ -z "$1" ]; then
echo -e "${B_YELLOW}Passing Category as first argument will filter the related settings.${RESET}"
fi
}
function psqlselectrows()
{
[ -z "$1" ] && echo -e "${B_RED}Argument 1 missing: Need table name${RESET}" ||
$psqlcommand "SELECT * from $1"
}