psql 命令行客户端入门
本教程共 50 篇 · 第 3 篇 · 更新于 2026-07-31 · 约 7 分钟阅读
3. psql 命令行客户端入门
本节目标:学完你能用 psql 连进数据库、执行一条 SQL、看懂几个最常用元命令,并会排查连不上的问题。
psql 是 Postgres 自带的命令行工具,几乎所有操作它都能干。图形界面虽好,但命令行才是真功夫。这一章带你入门。
psql 是什么
psql 不是数据库本身,而是连数据库的「客户端」。你敲的命令,通过网络或本地 socket 传给服务器,服务器算完把结果返回来,psql 负责把结果排好版显示给你。
它的好处是:不需要图形界面、能写脚本批量跑、远程服务器上随时可用。后面你会越来越离不开它。
连接到数据库
最基础的连接命令:
psql -U postgres
-U指定用哪个数据库用户,这里是超级用户postgres。- 不写数据库名时,默认连和用户名同名的库。我们还没建自己的库,可以先连默认的
postgres库。
更完整的连接写法,把主机、端口、库名都写上:
psql -h localhost -p 5432 -U postgres -d postgres
各参数含义:
-h:服务器地址,本机用localhost。-p:端口,默认5432。-U:用户名。-d:要连的数据库名。
Tip如果连的是本机,且当前系统用户正好叫
postgres,可以直接敲psql不带任何参数,它会用当前系统用户身份连同名库,最省事。
连上之后,你会看到这样的提示符:
postgres=#
postgres 是当前库名,# 表示你是超级用户。普通用户显示的是 =>。后面我们在书里都用 postgres=# 来表示你正站在 psql 里。
退出 psql
敲这个就能退出,回到系统命令行:
\q
也可以按 Ctrl + D(Linux/macOS)退出。Windows 上同样是 Ctrl + D 或 \q。
执行 SQL
在提示符后面直接写 SQL,结尾加分号,回车就执行。比如看版本:
SELECT version();
再比如做个简单计算:
SELECT 2 + 2;
还可以一次跑多条,用分号隔开:
SELECT 1 + 1;
SELECT now();
TipSQL 不区分大小写,但惯例是把关键字写成大写,自己定义的表名、列名用小写,看着清楚。另外,分号是「语句结束符」,漏写分号 psql 会一直等你继续输,出现
postgres-#这样的续行提示,补个分号回车即可。
元命令(反斜杠命令)
psql 有一类以反斜杠 \ 开头的命令,它们不是 SQL,而是 psql 自己用的「快捷操作」,叫元命令(meta-command)。新手记住下面几个就够用了。
列出所有数据库:
\l
列出当前库的所有表:
\dt
查看某张表的结构:
\d users
查看所有元命令帮助:
\?
查看 SQL 命令的语法帮助, 比如想看 CREATE TABLE 怎么写:
\h CREATE TABLE
Note元命令结尾不用写分号。一旦你打了
\,psql 就当它是指令,不会等你输分号。这是新手常踩的坑:在\d后面手滑加个分号,psql 会把它当普通文本报错。
更多好用的元命令
除了上面几个,下面这些也值得记住:
\dn:列出当前库的所有模式(schema)。\df:列出函数。\dv:列出视图。\du:列出数据库角色(用户)。\x:开启「横向展开」显示,宽表竖着看更清楚。\timing:打开执行耗时统计,每条 SQL 跑多久一目了然。\i 文件.sql:从文件里读取 SQL 并执行,做批量操作很方便。\c 库名:切换当前连接的数据库(下一章细讲)。
Tip觉得
\l、\dt输出太宽?先敲\x打开扩展模式,再执行,结果会一行一个字段竖着排,手机小屏也看得清。
一个完整示例
假设我们已经连上,看看库里有什么:
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+-------+-----------------------
postgres | postgres | UTF8 | C | C |
template0 | postgres | UTF8 | C | C |
template1 | postgres | UTF8 | C | C |
(3 rows)
这里 template0 和 template1 是系统自带的模板库,你先不用管,下一章建库时再聊。
用文件跑 SQL
如果你把一串 SQL 写进文件 init.sql,可以这样执行:
# 方式一:进 psql 后用 \i
postgres=# \i init.sql
# 方式二:命令行直接喂进去
psql -U postgres -d mydb -f init.sql
这招在批量建表、导数据时用得非常多。
常见连接错误
连不上是新手最常遇到的问题。我列几个典型报错和原因。
报错:command not found
psql: command not found
说明 psql 没装,或者没加进 PATH。Windows 用安装菜单里的 SQL Shell 打开,或把 bin 目录加进 PATH。
报错:服务器没启动
connection to server on socket "...5432" failed:
No such file or directory
Is the server running locally and accepting connections?
这是服务没起来。回到上一章确认服务已启动。
报错:角色不存在
FATAL: role "xxx" does not exist
你用的用户名在数据库里不存在。检查 -U 后面的名字,默认超级用户是 postgres。
报错:密码错误
FATAL: password authentication failed for user "postgres"
密码输错了。确认安装时设置的超级用户密码。
报错:连接被拒
FATAL: no pg_hba.conf entry for host "..."
这是访问控制(pg_hba.conf)没放行这个来源。本机连一般不会有,远程连才容易碰上,后面讲权限章节再展开。
Warning如果反复连不上,先看服务在不在跑,再看用户名和密码。八成问题出在这三样上,别急着重装。我之前就花一晚上排查,最后发现是服务根本没启动。
不进交互模式也能跑 SQL
不想进 psql 交互界面,也能直接执行一条 SQL:
psql -U postgres -d mydb -c "SELECT count(*) FROM users;"
-c 后面跟一条 SQL,执行完立刻退出。适合写进脚本里自动跑。要跑多条,用 -f 指定文件更方便(前面提过)。
历史命令与自动补全
psql 支持用上下方向键翻历史命令,这点对反复调试特别有用。连表名、列名也能补全:输入前几个字母按 Tab,psql 会列出匹配的对象名。
Tip按两下
Tab会列出所有可能的补全项。表很多时这个补全能省不少打字,也更不容易拼错表名。
调整输出格式
psql 的输出能用 \pset 调。几个常用的:
\pset border 2:给表格加完整边框,好看也好贴。\pset format wrapped:宽行自动换行,不撑破屏幕。\pset null '(null)':把空值显示成(null),和空字符串区分开。
这些设置只在当前会话有效,退出就复位。想永久生效,把配置写进家目录的 .psqlrc 文件。
把查询结果存成文件
跑完查询想导出结果:
postgres=# \o result.txt
postgres=# SELECT * FROM users;
postgres=# \o
\o 文件 之后所有输出都写进文件,\o 不带参数关掉,恢复在屏幕显示。适合把报表结果留档。
当前连的是谁、连的哪
忘了自己身份?两条命令看清:
SELECT current_user; -- 当前登录的数据库用户
SELECT current_database(); -- 当前所在的数据库
SELECT inet_server_port(); -- 当前连的端口
Note多人协作或连了多个库时,这几条能帮你确认「我现在到底以谁的身份、在哪個库里操作」,避免改错地方。我之前就因为没确认,改到了测试库还以为改的是正式库。
下一章我们讲图形界面 pgAdmin,它和 psql 是互补的。