从命令行运行PostgreSQL查询

468

我向表中插入了数据...现在我想通过命令显示包含行、列和数据的整个表,我该如何做?

我插入了一条数据到一个表里……现在我想通过命令来查看整张表格,包括行、列以及数据。该怎样显示呢?

10个回答

736

psql -U username -d mydatabase -c 'SELECT * FROM mytable'

如果你是 postgresql 新手,并且不熟悉使用命令行工具 psql,那么在进入交互式会话时应该注意一些混乱的行为。

例如,启动一个交互式会话:

psql -U username mydatabase 
mydatabase=#

此时,您可以直接输入查询,但必须记得在查询末尾加上分号;

例如:

mydatabase=# SELECT * FROM mytable;
如果你忘记了分号,则在按回车键时,因为psql会认为你没有完成查询输入,所以返回的结果行将为空。这可能导致各种混淆。例如,如果重新输入相同的查询,很可能会创建语法错误。
作为实验,尝试在psql提示符下键入任何您想要的乱码,然后按回车键。psql将静默提供一个新行。如果在该新行上输入分号,然后按Enter,则会收到以下错误:
mydatabase=# asdfs 
mydatabase=# ;  
ERROR:  syntax error at or near "asdfs"
LINE 1: asdfs
    ^

经验法则是: 如果你没有从psql收到任何响应,但你期望至少有些响应,那么你可能忘记了分号;


5
至少从版本7.2开始(这是我检查的最早版本,可能更早),psql就有了--single-line(或者-s)选项,该选项可以使每个命令立即执行,无需添加分号。 - Gordon
9
我花了一个小时进行调试,问题是缺少了分号。谢谢。 - Dawson B
@Gordon提到的单行选项是大写字母S(即-S),如果您使用小写字母-s,那意味着单步模式(确认每个查询)。您可以通过运行psql --help来查看选项。 - Eric Mutta

159
SELECT * FROM my_table;
my_table是您的表格名称。

编辑:

psql -c "SELECT * FROM my_table"

或者只需使用 psql,然后键入您的查询。


23
使用以下命令可以在您的数据库中查询my_table表格中的所有数据:psql -U 用户名 -c 您的数据库 "SELECT * FROM my_table" - DrColossos
4
如上所述,如果您使用的是Windows系统,请在命令结尾处加上分号 **;**。请参阅针对Windows用户的“非WS”(notws)。基本上,在打开控制台提示后,只需输入cmd.exe /c chcp 1252即可。 - D_Guidi
2
对于未来的用户,请确保在数据库名称之前添加“-d”,并在查询之前添加“-c”: psql -U用户名 -d我的数据库-c 'SELECT * FROM mytable' - jmhead
4
对我没用。我执行了psql: FATAL: database "SELECT * FROM tb_name" does not exist - Jaswinder
1
@GstjiSaini 看起来 DrColossos 忘记了 -d 参数 psql -U ravil -d hw5 -c "SELECT * FROM table_name;" -- 它是有效的。 - dehasi
显示剩余5条评论

78
如果您的数据库有密码保护,则解决方案如下:

PGPASSWORD=password  psql -U username -d dbname -c "select * from my_table"

4
从来不知道可以这种方式提供密码。在进行测试时,这真的很方便。谢谢。 - zhihong
1
警告:这将使密码以明文形式在shell历史记录中可用。 - Oliver

69

从应用程序中打开“SQL Shell (psql)”(Mac)。

enter image description here

按回车键使用默认设置。在提示输入密码时输入密码。

enter image description here

*) 输入\?获取帮助

*) 输入\conninfo查看你连接的用户。

*) 输入\l查看数据库列表。

enter image description here

*) 通过输入\c <Name of DB>连接到一个数据库,例如\c GeneDB1

enter image description here

你会看到密钥提示已更改为新的数据库,如下所示:enter image description here

*) 现在你已经连接到了一个数据库,想知道该数据库的模式。最好的命令是\dn

输入图像说明

其他同样适用(但不如好的)命令为select schema_name from information_schema.schemata;select nspname from pg_catalog.pg_namespace;

输入图像说明

-) 现在您已经拥有了模式,想要知道这些模式中的表。为此,可以使用dt命令。例如:\dt "GeneSchema1".*

输入图像说明

*) 现在,您可以执行查询。例如:

输入图像说明

*) 这是pgAdmin中上述数据库、模式和表的外观:

输入图像说明


我们如何获取整个模式的块?连接数据库后,以下语句无法正常工作:SELECT show_chunks(older_than => interval '1 day'); - ImranRazaKhan
看起来 show_chucks() 是你正在调用的一个方法或存储过程。我不知道,因为我不知道那个方法的文档。你可以尝试使用 \dt "YourSchema".* 来查看吗? - Gene

13

我还注意到查询

SELECT * FROM tablename;

在psql命令提示符上会出错,但是

SELECT * FROM "tablename";

可以正常运行,这真的很奇怪,所以不要忘记使用双引号。 我一直都很喜欢数据库 :-(


还要注意末尾的; - Mechanic

13

我对 @Grant 的答案毫不怀疑。但有时我会遇到一些问题,例如如果列名与postgresql的任何保留关键字相似,比如在这种情况下是 natural,则类似的SQL很难从命令行运行,因为在查询字段中需要 "\natural\"。因此,我的方法是将SQL编写到单独的文件中,并从命令行运行SQL文件。这也有另一个优点。如果您需要更改大型脚本的查询,您无需更改脚本文件或命令。只需更改这个SQL文件就可以了。

psql -h localhost -d database -U postgres -p 5432 -a -q -f /path/to/the/file.sql

6

## Using SQL file
PGPASSWORD=myPassword psql -h myDbHost -U myUser -p 5432 -d my_db -a -q -f /path/to/sql/file.sql
## Or
PGPASSWORD=myPassword psql -h myDbHost -U myUser -p 5432 -d my_db < /path/to/sql/file.sql

## Using command
PGPASSWORD=myPassword psql -h myDbHost -U myUser -p 5432 -d my_db -c "select * from my table limit 1;"

5
  1. 打开命令提示符并转到Postgres安装的目录。在我的情况下,我的 Postgres路径是"D:\TOOLS\Postgresql-9.4.1-3"。然后进入Postgres的bin目录。因此,命令提示符显示为"D:\TOOLS\Postgresql-9.4.1-3 \ bin>"
  2. 现在我的目标是使用“UserId”值从用户表中选择“UserName”。因此,数据库查询为“Select u.\"UserName\" from users u Where u.\"UserId\"=1”。

对于postgres的psql命令提示符,将相同的查询编写如下所示:

D:\TOOLS\Postgresql-9.4.1-3\bin>psql -U postgres -d DatabaseName -h localhost - t -c "Select u.\"UserName\" from users u Where u.\"UserId\"=1;


4

我将为Windows机器上的一条命令增添我的经验。我想尝试运行一条单一命令以获取表格内容。

这是对于我有效的单一命令:

psql -U postgres -d typeorm -c "SELECT * FROM \"Author\"";

  • -U postgres - 用户名
  • -d typeorm - 我想要连接的数据库名称
  • -c ... - 查询命令
  • ; - 分号

我遇到了问题,主要困扰于如何准确地设置查询部分。我尝试了不同的命令,比如:用 ', ", (), 但是除了这种记法,没有其他的方式有效。


3

如果要在受密码保护的数据库中直接运行SQL命令,最好使用命令行中的连接字符串格式。使用以下命令:

psql -d postgresql://postgres:password@localhost:5432/dbname 
-c "create database sample1 --or any command"

当使用 kubectl exec 将数据传输到客户端时,此方法可行,例如:kubectl exec -it postgresql-client -n postgresql-client -- psql -d postgresql://user:pwd@mydbhost:5432/mydb -c "select value,data from schema.mappings where source='mysource' and key='mykey' Order By value;" --csv - Dennis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接