PostgreSQL教程(一):從頭開始
本文檔為PostgreSQL 9.6.0文檔,本轉載已得到原譯者彭煜瑋授權。
自然,在你能開始使用PostgreSQL之前, 你必須安裝它。PostgreSQL很有可能已經安裝到你的節點上了, 因為它可能包含在你的操作係統的發布裏, 或者是係統管理員已經安裝了它。如果是這樣的話, 那麼你應該從操作係統的文檔或者你的係統管理員那裏獲取有關如何訪問PostgreSQL的信息。
如果你不清楚PostgreSQL是否已經安裝, 或者不知道你能否用它(已經安裝的)做自己的實驗,那麼你就可以自己安裝。 這麼做並不難,並且是一次很好的練習。PostgreSQL可以由任何非特權用戶安裝, 並不需要超級用戶 (root)的權限。
如果你準備自己安裝PostgreSQL, 那麼請參考Chapter 16以獲取安裝的有關信息, 安裝之後再回到這個指導手冊來。一定要記住要盡可能遵循有關設置合適的環境變量章節裏的信息。
如果你的站點管理員沒有按照缺省的方式設置各項相關參數, 那你還有點額外的活兒要幹。比如,如果數據庫服務器機器是一個遠程的機器, 那你就需要把PGHOST環境變量設置為數據庫服務器的名字。環境變量PGPORT也可能需要設置。總而言之就是: 如果當你試著啟動一個應用而該應用報告說不能與數據庫建立聯接時, 你應該馬上與你的數據庫管理員聯係,如果你就是管理員, 那麼你就要參考文檔以確保你的環境變量得到正確的設置。 如果你不理解隨後的幾段,那麼先閱讀下一節。
在我們繼續之前,你應該先了解PostgreSQL的係統架構。 對PostgreSQL的部件之間如何相互作用的理解將會使本節更易理解。
在數據庫術語裏,PostgreSQL使用一種客戶端/服務器的模型。一次PostgreSQL會話由下列相關的進程(程序)組成:
一個服務器進程,它管理數據庫文件、接受來自客戶端應用與數據庫的聯接並且代表客戶端在數據庫上執行操作。 該數據庫服務器程序叫做postgres。
那些需要執行數據庫操作的用戶的客戶端(前端)應用。 客戶端應用可能本身就是多種多樣的:可以是一個麵向文本的工具, 也可以是一個圖形界麵的應用,或者是一個通過訪問數據庫來顯示網頁的網頁服務器,或者是一個特製的數據庫管理工具。 一些客戶端應用是和 PostgreSQL發布一起提供的,但絕大部分是用戶開發的。
和典型的客戶端/服務器應用(C/S應用)一樣,這些客戶端和服務器可以在不同的主機上。 這時它們通過 TCP/IP 網絡聯接通訊。 你應該記住的是,在客戶機上可以訪問的文件未必能夠在數據庫服務器機器上訪問(或者隻能用不同的文件名進行訪問)。
PostgreSQL服務器可以處理來自客戶端的多個並發請求。 因此,它為每個連接啟動("forks")一個新的進程。 從這個時候開始,客戶端和新服務器進程就不再經過最初的 postgres進程的幹涉進行通訊。 因此,主服務器進程總是在運行並等待著客戶端聯接, 而客戶端和相關聯的服務器進程則是起起停停(當然,這些對用戶是透明的。我們介紹這些主要是為了內容的完整性)。
看看你能否訪問數據庫服務器的第一個例子就是試著創建一個數據庫。 一台運行著的PostgreSQL服務器可以管理許多數據庫。 通常我們會為每個項目和每個用戶單獨使用一個數據庫。
你的站點管理員可能已經為你創建了可以使用的數據庫。 如果這樣你就可以省略這一步, 並且跳到下一節。
要創建一個新的數據庫,在我們這個例子裏叫mydb,你可以使用下麵的命令:
$ createdb mydb
如果不產生任何響應則表示該步驟成功,你可以跳過本節的剩餘部分。
如果你看到類似下麵這樣的信息:
createdb: command not found
那麼就是PostgreSQL沒有安裝好。或者是根本沒安裝, 或者是你的shell搜索路徑沒有設置正確。嚐試用絕對路徑調用該命令試試:
$ /usr/local/pgsql/bin/createdb mydb
在你的站點上這個路徑可能不一樣。和你的站點管理員聯係或者看看安裝指導獲取正確的位置。
另外一種響應可能是這樣:
createdb: could not connect to database postgres: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
這意味著該服務器沒有啟動,或者沒有按照createdb預期地啟動。同樣, 你也要查看安裝指導或者谘詢管理員。
另外一個響應可能是這樣:
createdb: could not connect to database postgres: FATAL: role "joe" does not exist
在這裏提到了你自己的登陸名。如果管理員沒有為你創建PostgreSQL用戶帳號, 就會發生這些現象。(PostgreSQL用戶帳號和操作係統用戶帳號是不同的。) 如果你是管理員,參閱Chapter 21獲取創建用戶帳號的幫助。 你需要變成安裝PostgreSQL的操作係統用戶的身份(通常是 postgres)才能創建第一個用戶帳號。 也有可能是賦予你的PostgreSQL用戶名和你的操作係統用戶名不同; 這種情況下,你需要使用-U選項或者使用PGUSER環境變量指定你的PostgreSQL用戶名。
如果你有個數據庫用戶帳號,但是沒有創建數據庫所需要的權限,那麼你會看到下麵的信息:
createdb: database creation failed: ERROR: permission denied to create database
並非所有用戶都被許可創建新數據庫。 如果PostgreSQL拒絕為你創建數據庫, 那麼你需要讓站點管理員賦予你創建數據庫的權限。出現這種情況時請谘詢你的站點管理員。 如果你自己安裝了PostgreSQL, 那麼你應該以你啟動數據庫服務器的用戶身份登陸然後參考手冊完成權限的賦予工作。 [1]
你還可以用其它名字創建數據庫。PostgreSQL允許你在一個站點上創建任意數量的數據庫。 數據庫名必須是以字母開頭並且小於 63 個字符長。 一個方便的做法是創建和你當前用戶名同名的數據庫。 許多工具假設該數據庫名為缺省數據庫名,所以這樣可以節省你的敲鍵。 要創建這樣的數據庫,隻需要鍵入:
$ createdb
如果你再也不想使用你的數據庫了,那麼你可以刪除它。 比如,如果你是數據庫mydb的所有人(創建人), 那麼你就可以用下麵的命令刪除它:
$ dropdb mydb
(對於這條命令而言,數據庫名不是缺省的用戶名,因此你就必須聲明它) 。這個動作將在物理上把所有與該數據庫相關的文件都刪除並且不可取消, 因此做這中操作之前一定要考慮清楚。
更多關於createdb和dropdb的信息可以分別在createdb和dropdb中找到。
Notes
[1]
為什麼這麼做的解釋:PostgreSQL用戶名是和操作係統用戶賬號分開的。 如果你連接到一個數據庫時,你可以選擇以何種PostgreSQL用戶名進行聯接; 如果你不選擇,那麼缺省就是你的當前操作係統賬號。 如果這樣,那麼總有一個與操作係統用戶同名的PostgreSQL用戶賬號用於啟動服務器, 並且通常這個用戶都有創建數據庫的權限。如果你不想以該用戶身份登陸, 那麼你也可以在任何地方聲明一個-U選項以選擇一個用於連接的PostgreSQL用戶名。
一旦你創建了數據庫,你就可以通過以下方式訪問它:
- 運行PostgreSQL的交互式終端程序,它被稱為psql, 它允許你交互地輸入、編輯和執行SQL命令。
- 使用一種已有的圖形化前端工具,比如pgAdmin或者帶ODBC或JDBC支持的辦公套件來創建和管理數據庫。這種方法在這份教程中沒有介紹。
- 使用多種綁定發行的語言中的一種寫一個自定義的應用。這些可能性在Part IV中將有更深入的討論。
你可能需要啟動psql來試驗本教程中的例子。 你可以用下麵的命令為mydb數據庫激活它:
$ psql mydb
如果你不提供數據庫名字,那麼它的缺省值就是你的用戶賬號名字。在前麵使用createdb的小節裏你應該已經了解了這種方式。
在psql中,你將看到下麵的歡迎信息:
psql (9.6.0)
Type "help" for help.
mydb=>
最後一行也可能是:
mydb=#
這個提示符意味著你是數據庫超級用戶,最可能出現在你自己安裝了 PostgreSQL實例的情況下。 作為超級用戶意味著你不受訪問控製的限製。 對於本教程的目的而言, 是否超級用戶並不重要。
如果你啟動psql時碰到了問題,那麼請回到前麵的小節。診斷createdb的方法和診斷 psql的方法很類似, 如果前者能運行那麼後者也應該能運行。
psql打印出的最後一行是提示符,它表示psql正聽著你說話,這個時候你就可以敲入 SQL查詢到一個psql維護的工作區中。試驗一下下麵的命令:
mydb=> SELECT version();
version
------------------------------------------------------------------------------------------
PostgreSQL 9.6.0 on x86_64-pc-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit
(1 row)
mydb=> SELECT current_date;
date
------------
2016-01-07
(1 row)
mydb=> SELECT 2 + 2;
?column?
----------
4
(1 row)
psql程序有一些不屬於SQL命令的內部命令。它們以反斜線開頭,"\"。 歡迎信息中列出了一些這種命令。比如,你可以用下麵的命令獲取各種PostgreSQL的SQL命令的幫助語法:
mydb=> \h
要退出psql,輸入:
mydb=> \q
psql將會退出並且讓你返回到命令行shell。 (要獲取更多有關內部命令的信息,你可以在psql提示符上鍵入\?。) psql的完整功能在psql中有文檔說明。在這份文檔裏,我們將不會明確使用這些特性,但是你自己可以在需要的時候使用它們。
最後更新:2017-08-16 13:32:17