概述
psql是PostgreSQL的命令行客戶端工具甥材,比起Oracle的sqlplus天吓,psql天生可用上下鍵翻命令鲫凶,也可以使用Tab鍵補全许布。
本地用postgres用戶直接輸入“psql”即可進入命令交互輸入模式。
進入psql的命令交互輸入模式就可以輸入psql工具特有的快捷命令箍铭, 這些快捷命令都是以斜杠“\”開頭的泊柬。
如使用“\l”命令查看有哪些數據庫,使用“\c testdb”命令連接到testdb數據庫上:
psql
\l
\c testdb
注:安裝PostgreSQL數據庫時诈火, 會創(chuàng)建一個與初始化數據庫時的操作系統(tǒng)用戶同名的數據庫用戶兽赁, 這個用戶是數據庫的超級用戶, 在此OS用戶下登錄數據庫時冷守, 因為執(zhí)行的是操作系統(tǒng)認證刀崖, 所以是不需要用戶名和密碼的, 用戶也可以通過修改pg_hba.conf文件來要求用戶輸入密碼拍摇。
退出客戶端:
\q
psql也支持直接使用命令行參數查詢信息和執(zhí)行SQL亮钦, 這種非交互模式與使用一般的Linux命令沒有區(qū)別, 如使用如下命令可以查看數據庫:
psql -l
psql常見連庫語句(指定主機充活、端口蜂莉、庫名、用戶):
psql -h 192.168.56.11 -p 5432 testdb postgres
這些連接參數也可通過環(huán)境變量指定混卵,如:
export PGDATABASE=testdb
export PGHOST=192.168.56.11
export PGPORT=5432
export PGUSER=postgres
然后運行psql映穗, 其運行結果與“psql -h 192.168.56.11 -p 5432 testdb postgres”的運行結果
相同。
詳請參考官方手冊“Reference”→“PostgreSQL Client Applications”→“psql”的內容幕随。
常用命令
1. 用\h查詢SQL語句
該命令用于查詢SQL語句的語法蚁滋, 如我們不知道如何用SQL語句創(chuàng)建用戶, 就可以執(zhí)行“\h create user”命令來查詢:
\h create user
2. 用\d查看對象信息
格式如下:
\d [ pattern ]
\d [ pattern ]+
該命令將顯示每個匹配“pattern”(表赘淮、 視圖辕录、 索引、 序列) 的信息梢卸, 包括對象中所有的列踏拜、 各列的數據類型、 表空間(如果不是默認的) 和所有特殊屬性(諸如“NOT NULL”或默認值等)等低剔。
唯一約束相關的索引速梗、 規(guī)則、 約束襟齿、 觸發(fā)器也同樣會顯示出來姻锁。如果關系是一個視圖, 還會顯示視圖的定義(“匹配模式”將在下面定義) 猜欺。
如果“\d”命令后什么都不帶位隶, 將列出當前數據庫中的所有表;“\d”命令后面跟一個表名开皿, 表示顯示這個表的結構定義:
\d t
結果為:
Table "public.t"
Column | Type | Modifiers
--------+-------------------------+-----------
id | integer | not null
name | character varying(4000) |
Indexes:
"t_pkey" PRIMARY KEY, btree (id)
“\d”命令也可以用于顯示索引信息涧黄, 示例如下:
\d t_pkey
結果為:
Index "public.t_pkey"
Column | Type | Definition
--------+---------+------------
id | integer | id
primary key, btree, for table "public.t"
“\d”命令后面的表名或索引名中也可以使用通配符篮昧, 如“*”或“?”等:
\d x?
使用“\d+”命令可以顯示比“\d”命令的執(zhí)行結果更詳細的信息:
\d+ t
列出所有的schema:
\dn
顯示所有的表空間:
\db
PostgreSQL中的表空間對應一個目錄, 放在這個表空間中的表笋妥, 就是把表的
數據文件放到該表空間下懊昨。
只顯示匹配的表
\dt
只顯示索引
\di
只顯示序列
\ds
只顯示視圖
\dv
只顯示函數
\df
列出數據庫中的所有角色或用戶
\dg
\du
在PostgreSQL數據庫中, 用戶和角色是不分的春宣,因此“\du”和“\dg”命令等價酵颁。
顯示表的權限分配情況:
\dp t
如果想顯示執(zhí)行SQL語句的時間, 可以用“\timing”命令:
\timing on
select count(*) from t;
3. 指定客戶端字符集
當客戶端的字符編碼與服務器不一致時月帝, 可能會出現亂碼躏惋。
可以使用“\encoding”命令指定客戶端的字符編碼。
設置客戶端的字符編碼為“gbk”:
\encoding gbk;
設置客戶端的字符編碼為“utf8”:
\encoding utf8;
4. 格式化輸出
格式化輸出的\pset命令語法如下:
\pset [option [value] ]
根據命令后面“option”和“value”的不同可以設置很多種不同的輸出格式嚷辅, 這里只介紹一些常用的用法簿姨。
默認情況下, psql中執(zhí)行SQL語句后輸出的內容是只有內邊框的表格(\pset boder 1)簸搞,
如果要像MySQL中一樣輸出帶有內外邊框的表格內容扁位, 可以用如下命令實現:
\pset boder 2
select * from t1;
輸出不帶任何邊框的內容:
\pset boder 0
select * from t1;
如需要將結果輸出為其他程序可以讀取的文件, 如以逗號分隔或以Tab分隔的文本文件攘乒, 這時就需要用到“\pset format unaligned”命令了,默認分隔符是“|”:
\pset format unaligned
select * from t1;
改成Tab分隔符:
\pset fieldsep '\t'
select * from t1;
將結果輸出到一個文件中:
\pset format unaligned
\t
\o test1.txt
select * from t1;
其中\(zhòng)t的作用是去除表頭和結尾的行數統(tǒng)計惋鹅。
5. 使用\x轉為按列顯示
使用“\x”命令可以把按行展示的數據變成按列展示:
\x
select * from pg_stat_activity;
如果數據行太長出現折行则酝, 就可以使用這里介紹的“\x”命令將其拆分為多行顯示。 這與MySQL中命令后加“\G”的功能類似闰集。
6. 執(zhí)行存儲在外部文件中的SQL
命令“\i <文件名>”用于執(zhí)行存儲在外部文件中的SQL語句或命令:
\x
\i test.sql
或在OS層命令行加-f參數來執(zhí)行SQL腳本文件中的命令:
psql -x -f test.sql
其中命令行參數“-x”的作用相當于在psql交互模式下運行“\x”命令沽讹。
7. 編輯命令
輸入“\e”命令后會調用一個編輯器, 在Linux下通常是Vi武鲁, 當“\e”命令不帶任何參數時則是生成一個臨時文件爽雄, 前面執(zhí)行的最后一條命令會出現在臨時文件中, 當編輯完成后退出編輯器并回到psql中時會立即執(zhí)行該命令沐鼠,且這些語句的內容在psql中是看不到的挚瘟。
“\e”后面也可以指定一個文件名, 但要求這個文件必須存在饲梭, 否則會報錯
\e test.sql
可以用“\ef”命令編輯一個函數的定義乘盖, 如果“\ef”后面不跟任何參數, 則會出現一個編輯函數的模板憔涉。如果“\ef”后面跟一個函數名订框, 則函數定義的內容會出現在Vi編輯器中, 當編輯完成后按“wq:”保存并退出兜叨, 再輸入“;”就會執(zhí)行所創(chuàng)建函數的SQL語句穿扳。
同樣輸入“\ev”且后面不跟任何參數時衩侥, 在Vi中會出現一個創(chuàng)建視圖的模板,然后用戶就可以在Vi中編輯這個創(chuàng)建視圖的SQL語句矛物, 編輯完成后茫死, 保存并退出, 再輸入分號“;”泽谨, 就會執(zhí)行所創(chuàng)建視圖的SQL語句璧榄。也可以編輯已存在的視圖的定義, 只需在“\ev”命令后面跟視圖的名稱即可吧雹。
“\ef”和“\ev”命令可以用于查看函數或視圖的定義骨杂, 當然需要注意, 退出Vi后雄卷,要在psql中輸入“\reset”來清除psql的命令緩沖區(qū)搓蚪,而不要輸入輸入“;”, 防止誤執(zhí)行創(chuàng)建函數和視圖的SQL語句:
\ev vm_class
\reset
8. 使用\echo打印信息
此命令通常用于在使用.sql腳本的文件中輸出提示信息丁鹉,比如組成分隔線:
\echo =========================================
select * from t1;
\echo =========================================
9. 其他命令
其他的命令可以用“?”命令來顯示:
\?
在此不一一列舉妒潭。
使用技巧
1. 歷史命令與補全功能
可以使用上下方向鍵把以前使用過的命令或SQL語句調出來, 連續(xù)單擊兩次Tab鍵表示把命令補全或給出輸入提示揣钦。
2. 自動提交
需要注意的是雳灾, 在psql中事務是自動提交的, 如果不想讓事務自動提交冯凹, 方法有兩種谎亩。
- 方法一: 運行“begin;”命令, 然后執(zhí)行DML語句宇姚, 最后再執(zhí)行commit或rollback語句匈庭。
- 方法二: 直接使用psql中的命令關閉自動提交功能:
\set AUTOCOMMIT off
注:這個命令中的“AUTOCOMMIT”是大寫的, 不能使用小寫浑劳, 如果使用小寫阱持, 雖不會報錯, 但會導致關閉自動提交的操作無效魔熏。
3. 獲取psql中快捷命令執(zhí)行的實際SQL
在啟動psql的命令行中加上“-E”參數衷咽, 就可以把psql中各種以“\”開頭的命令執(zhí)行的實際SQL語句打印出來:
psql -E postgres
比如我們再執(zhí)行快捷鍵就會顯示QUERY實際內容。
如果要在已運行的psql中顯示了某個命令實際執(zhí)行的SQL語句后又想關閉此功能蒜绽,則:
\set ECHO_HIDDEN off
如果要打開:
\set ECHO_HIDDEN on