本文實(shí)踐環(huán)境
- macOS Mojave 10.14.6
- docker 19.03.1
- docker-compose 1.24.1
- node 11.10.1
什么是 PostgreSQL ?
PostgreSQL簡(jiǎn)稱(chēng)PG,是一款功能強(qiáng)大且開(kāi)源免費(fèi)的關(guān)系型數(shù)據(jù)庫(kù)。它支持大部分 SQL 標(biāo)準(zhǔn)并且提供了許多現(xiàn)代特性:
- 復(fù)雜查詢
- 外鍵
- 觸發(fā)器
- 可更新視圖
- 事務(wù)完整性
- 多版本并發(fā)控制
同樣,PostgreSQL可以用許多方法擴(kuò)展,比如, 通過(guò)增加新的:
- 數(shù)據(jù)類(lèi)型
- 函數(shù)
- 操作符
- 聚集函數(shù)
- 索引方法
- 過(guò)程語(yǔ)言
docker 安裝
在項(xiàng)目根目錄下新建一個(gè) docker-compose.yml 文件:
version: '3'
services:
postgres:
container_name: pg
image: postgres:9.6 # 使用的是 9.6 版本的 pg 數(shù)據(jù)庫(kù)
restart: always
ports:
- '54321:5432' # 把容器的 5432 端口映射到本機(jī)的 54321端口
environment:
POSTGRES_PASSWORD: 123456 # 設(shè)置 postgres 用戶的默認(rèn)密碼
volumes:
- ./.docker/postgres-data:/var/lib/postgresql/data # 把數(shù)據(jù)庫(kù)目錄掛載出來(lái)
讓pg數(shù)據(jù)庫(kù)服務(wù)在后臺(tái)運(yùn)行
$ docker-compose up -d
查詢?nèi)萜鬟\(yùn)行情況
$ docker ps
嘗試登錄數(shù)據(jù)庫(kù)
$ docker exec -it ${容器ID} psql -U postgres

什么是 psql ?
psql 是 pg 數(shù)據(jù)庫(kù)中的一個(gè)命令行交互式客戶端工具
使用 psql 連接數(shù)據(jù)庫(kù)的方法:
psql -h <hostname or ip> -p <端口> [數(shù)據(jù)庫(kù)名稱(chēng)] [用戶名稱(chēng)]
這些連接參數(shù)也可以用環(huán)境變量指定,比如:
- export PGDATABASE=testdb
- export PGHOST=127.0.0.1
- export PGPORT=5432
- export PGUSER=postgres
psql 的常用命令
psql 的命令都是以斜杠 \ 開(kāi)頭的。
\h 查看幫助信息
\l 查看所有數(shù)據(jù)庫(kù)
\q 退出 psql
\d [ pattern ] 該命令將顯示每個(gè)匹配關(guān)系(表、視圖、索引、序列)的信息,可以加上 + 查看更多的信息,如 \d+
不加任何參數(shù)表示查看當(dāng)前數(shù)據(jù)庫(kù)的所有表。
\d tablename后面跟一個(gè)表名,表示顯示這個(gè)表的結(jié)構(gòu)定義\d indexname也可以顯示索引的信息,如 \d 索引名稱(chēng)\d *后面也可以跟通配符如*或?,\d x*\d+將顯示比\d更詳細(xì)的信息,還會(huì)顯示任何與表關(guān)系的注釋?zhuān)约氨碇谐霈F(xiàn)的 OID
\dt 只顯示匹配的表
\di 只顯示索引
\ds 只顯示序列
\dv 只顯示視圖
\df 只顯示函數(shù)
\timing on或\timing off顯示 SQL 已執(zhí)行的時(shí)間,默認(rèn)情況下是 off\dn列出所有的 schema\du或\dg列出所有的數(shù)據(jù)庫(kù)用戶和角色\db顯示所有的表空間,表空間其實(shí)是一個(gè)目錄,放在這個(gè)表空間的表,就是把表的數(shù)據(jù)文件發(fā)到這個(gè)表空間下。\dp或\z顯示表的權(quán)限分配情況\encoding指定客戶端的字符編碼,如\encoding UTF8;\pset設(shè)置輸出的格式,\pset border 0 :表示輸出內(nèi)容無(wú)邊框。border 1 :表示邊框只在內(nèi)部。border 2 :內(nèi)外都有邊框\x把表中的每一行的每列數(shù)據(jù)都拆分為單行展示,與 MySQL 中的\G的功能類(lèi)似。\echo用于輸出一行信息,通常用于在 .sql 文件中輸出一些提示信息。\password設(shè)置密碼\conninfo列出當(dāng)前數(shù)據(jù)庫(kù)連接的信息\dx查看數(shù)據(jù)庫(kù)中安裝的擴(kuò)展 或select * from pg_extension;
執(zhí)行存儲(chǔ)在外部文件中的 SQL 命令
\i <文件名> 執(zhí)行存儲(chǔ)在外部文件中的 sql 語(yǔ)句
當(dāng)然也可以在 psql 命令行加 -f <filename> 來(lái)執(zhí)行 SQL 腳本文件中的命令,如 psql -f ./test.sql
psql 的使用技巧和注意事項(xiàng)
在啟動(dòng) psql 命令后中加 "-E" 參數(shù),就可以把 psql 中各種以 "" 開(kāi)頭的命令執(zhí)行的實(shí)際 SQL 打印出來(lái),如下
psql -E postgres,如果想關(guān)閉此功能,可以使用\set ECHO_HIDDEN on | off自動(dòng)提交方面的技巧
psql 中的事務(wù)是自動(dòng)提交的,可以運(yùn)行 begin; 然后執(zhí)行 dml 語(yǔ)句,最后再執(zhí)行 commit 或 rollback 語(yǔ)句。或 直接使用 psql 中的命令關(guān)閉自動(dòng)提交的功能。\set AUTOCOMMIT off
- 查看數(shù)據(jù)庫(kù)、表、索引大小
select pg_size_pretty(pg_table_size('test'));
select pg_size_pretty(pg_database_size('david'));
select pg_size_pretty(pg_indexes_size('test'));