为什么有些 psql 行在数据库名称后有 (# 或 '#?

Why do some psql lines have (# or '# after the database name?

我在 Mac 上的命令行中使用 psql。通常,当我键入命令时,开头行显示为 database_name=#。我用 ; 终止命令,效果很好。

有时当我写一个命令(从我正在学习的教科书上复制粘贴)时,我的开头行是以下之一:

postgis_in_action(#

postgis_in_action'#

请问('是什么意思?我该如何逃脱他们回到 'normal'?

当您键入一个多行查询并有一些开始和结束括号,例如 ( ) 时,开始行将改变,让用户知道他已经开始了一个需要关闭的括号。

看下面的例子:

    node1=# select
node1-# *
node1-# from
node1-# dept
node1-# where
node1-# deptno=
node1-# 1 and loc in
node1-# (
node1(# 'isb'
node1(# )
node1-# ;
 deptno | dname | loc 
--------+-------+-----
(0 rows)

node1=#

如果用户不知何故忘记关闭括号,则开头行将显示 database_name(#

即使是缺少括号的单行查询也会导致相同的开头行。

node1=# select * from dept where deptno=1 and loc in ('isb';

node1(#

要使开头行正常,您必须完成查询或只需按 CTRL+C 键。

披露:我为 EnterpriseDB (EDB)

工作

您输入的命令在您上次点击 "return" 时位于带括号的结构或 ' 字符串的中间。它正在等待您关闭它们。它将忽略它看到的任何正常命令结束的 ; 字符,直到您关闭这些构造。

如果到目前为止你的命令是正确的,那么你只需要把它写完。

如果你想放弃这个命令,因为你应该在几行之前关闭你的构造,而现在关闭它们是错误的做法,那么你可以点击 ctrl-C,或者在 ( 的情况下,您可以单独在一行上键入 \r。对于',你需要在使用\r之前关闭它,因为'\r'是字符串中的合法内容,所以它无法将你从字符串中转义出来。

此外,您可以通过在一行中单独键入 \e 来编辑您目前为止的命令。但是同样,当在 ' 中时,您需要先关闭引号,否则 \e 只会成为字符串的一部分。

这意味着您缺少右大括号或撇号。

正常一:

postgres=# select pg_size_pretty(pg_relation_size('test'));                                                                                                                 
pg_size_pretty
----------------
8192 bytes
(1 row)

错过了braces/apostrophe:

postgres=# select pg_size_pretty(pg_relation_size('test')                                                                                                                   
postgres(# );
pg_size_pretty
----------------
8192 bytes
(1 row)

postgres=# select count(*) from test where name = 'vignesh
postgres'# ';
count
-------
10
(1 row)

没有分号的有效查询将带有连字符:

postgres=# select count(*) from test where name = 'vignesh'
postgres-# ;
count
-------
100
(1 row)

只需按 Ctrl + C 取消该查询。由于该查询已取消而不是 运行,因此按向上箭头将不会弹出该查询,因为它在历史记录中不可用。