psql 是 PostgreSQL 自带的命令行工具,功能强大,支持交互式查询和脚本编写。
所有元命令以 \ 开头,不区分大小写。
| 命令 | 说明 | 示例 |
|---|
\c [db] [user] | 切换数据库 | \c mydb postgres |
\conninfo | 显示当前连接信息 | \conninfo |
\l | 列出所有数据库 | \l |
\dt | 列出所有表 | \dt+ 显示更多信息 |
\d [table] | 查看表结构 | \d users |
\di | 列出索引 | \di |
\ds | 列出序列 | \ds |
\dv | 列出视图 | \dv |
\df | 列出函数 | \df+ 显示函数源码 |
\dn | 列出 Schema | \dn |
\db | 列出表空间 | \db |
\du | 列出用户/角色 | \du |
\dp [table] | 显示表权限 | \dp users |
\d+ users
\dv+ user_view
\df+ my_function
\di+ idx_users_email
\dx
| 命令 | 说明 | 示例 |
|---|
\g | 重新执行上一条命令 | \g |
\i file.sql | 执行外部 SQL 文件 | \i /tmp/backup.sql |
\o file.txt | 将输出写入文件 | \o result.txt |
\o | 恢复输出到终端 | \o |
\copy | 导入/导出文件 | \copy users TO 'users.csv' CSV |
\! cmd | 执行操作系统的命令 | \! ls -la |
| 命令 | 说明 |
|---|
\x | 切换扩展显示(每行一字段,适合宽表) |
\a | 切换对齐/非对齐模式 |
\H | 切换 HTML 输出格式 |
\t | 切换只显示行(不显示列名) |
\pset | 设置输出格式 |
\encoding | 显示/设置编码 |
\x
SELECT * FROM users WHERE id = 1;
\pset format csv
SELECT id, name, email FROM users;
| 命令 | 说明 |
|---|
\? | 列出所有元命令 |
\h | 查看 SQL 命令帮助 |
\h SELECT | 查看 SELECT 语法 |
\help | 同 \? |
| 命令 | 说明 |
|---|
\e | 在编辑器中编辑当前查询 |
\ef [func] | 编辑函数定义 |
\s | 显示历史命令 |
\s file.txt | 将历史保存到文件 |
\r | 重置输入缓冲区(取消当前输入) |
\q | 退出 psql |
psql -h localhost -p 5432 -U postgres -d mydb
psql "postgresql://postgres:password@localhost:5432/mydb"
psql
sudo -u postgres psql
| 参数 | 说明 | 示例 |
|---|
-h | 主机地址 | -h 192.168.1.100 |
-p | 端口 | -p 5432 |
-U | 用户名 | -U postgres |
-d | 数据库名 | -d mydb |
-W | 强制密码提示 | -W |
-f | 执行 SQL 文件 | -f script.sql |
-c | 执行单条 SQL | -c "SELECT 1" |
-l | 列出所有数据库后退出 | -l |
适合在脚本中使用:
psql -U postgres -d mydb -c "SELECT count(*) FROM users"
psql -U postgres -d mydb -f /path/to/script.sql
echo "SELECT version();" | psql -U postgres
psql -U postgres -d mydb < backup.sql
SELECT
pid,
now() - pg_stat_activity.query_start AS duration,
query,
state
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY duration DESC
LIMIT 5;
SELECT relation::regclass, * FROM pg_locks WHERE NOT granted;
SELECT
relname,
pg_size_pretty(pg_relation_size(relid)) AS size
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_relation_size(relid) DESC;
psql -U postgres -d mydb
\l
\dt
psql -U postgres -d mydb -c "SELECT table_name FROM information_schema.tables WHERE table_schema='public'"
psql -U postgres -d mydb -c "\copy (SELECT id, name, email FROM users) TO '/tmp/users.csv' CSV HEADER"
psql -U postgres -d mydb -f init.sql