12

alias是否可以在 psql 中以某种方式创建别名(如 Unix命令)?

我的意思是,不是 SQL FUNCTION,而是简化手动查询的本地别名?

4

5 回答 5

20

我不知道有什么可能。只有基于psql变量的psql解决方法,但有很多限制 - 使用此查询的参数很困难。

postgres=# \set whoami 'SELECT CURRENT_USER;'
postgres=# :whoami
 current_user 
--------------
pavel
(1 row)
于 2013-04-26T10:16:43.487 回答
10

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 文字转义,结果将用作参数。如果变量名用双引号括起来,它将作为 SQL 标识符进行转义,结果将用作参数。

您还可以使用反引号来运行 shell 命令

用反引号 (`) 括起来的参数被视为传递给 shell 的命令行。命令的输出(删除任何尾随换行符)被视为参数值。上述转义序列也适用于反引号。

于 2016-03-24T15:08:56.920 回答
1

使用 UDF 怎么样?您可以创建一个返回表(一组)的 UDF,然后您可以这样查询它: select * from udf();

它不是那么干净,但总比没有好,而且它是便携式的。UDF 也可以带参数。

于 2013-04-27T00:42:18.040 回答
0

为什么不使用视图?可能意见会对您的情况有所帮助。

于 2013-05-13T09:04:31.163 回答
-1

如果您需要从命令行(而不是从 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"
}

上面的命令从表中选择行,传入参数。

笔记:

  1. 根据需要更改数据库名称。
  2. 默认情况下,架构是公共的。~/.psqlrc要拥有另一个默认架构,请在文件中添加以下行。

SET SEARCH_PATH TO <schema_name>;

  1. 如果数据库受密码保护,请参考此内容并使用安全方法。

如果有帮助的话,我已经做了一些命令供我使用。

  1. psqlselectrows - 从表中选择行
  2. psqlgettablecount - 获取表的行数
  3. psqltruncatetable - 在提示时截断表
  4. psqlgettablesize - 获取表的大小
  5. psqlgetvacuumdetails - 获取表的真空详细信息
  6. psqlsettings - 获取为 Postgres 配置的默认和修改设置。

(以上所有命令都需要表名作为第一个参数)

#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"
}
于 2019-05-08T13:56:26.490 回答