關係資料庫管理系統是許多網站和應用程式的關鍵組成部分。它們提供了一種結構化的方式來儲存,組織和訪問資訊。

PostgreSQL或Postgres是一個關係資料庫管理系統,提供SQL查詢語言的實現。它是許多小型和大型專案的流行選擇,並且具有符合標準並具有許多高階功能(如可靠事務和併發讀取鎖)的優點。

本指南演示瞭如何在Ubuntu 18.04 VPS例項上安裝Postgres,並提供了有關基本資料庫管理的說明。

先決條件

為了跟隨本教程,您將需要一個Ubuntu 18.04伺服器,該伺服器已通過遵循我們的初始伺服器設定Ubuntu 18.04指南進行配置。完成此先決條件教程後,您的伺服器應該有一個非root使用者,具有sudo許可權和基本防火牆。

安裝PostgreSQL

Ubuntu的預設儲存庫包含Postgres軟體包,因此您可以使用apt打包系統安裝這些軟體包。

由於這是您第一次apt在此會話中使用,請重新整理本地包裹索引。然後,安裝Postgres軟體包以及-contrib增加一些附加實用程式和功能的軟體包:

sudo apt update
sudo apt install postgresql postgresql-contrib

現在安裝了該軟體,我們可以瞭解它的工作原理以及它可能與您可能使用的類似資料庫管理系統的不同之處。

使用PostgreSQL角色和資料庫

預設情況下,Postgres使用稱為“角色”的概念來處理身份驗證和授權。這些在某些方面類似於普通的Unix風格的賬戶,但是Postgres並沒有區分使用者和組,而是傾向於更靈活的術語“角色”。

安裝後,Postgres被設定為使用ident身份驗證,這意味著它將Postgres角色與匹配的Unix / Linux系統帳戶相關聯。如果Postgres中存在一個角色,則具有相同名稱的Unix / Linux使用者名稱可以作為該角色登入。

安裝過程建立了一個名為postgres的使用者帳戶,它與預設的Postgres角色相關聯。為了使用Postgres,您可以登入到該帳戶。

有幾種方式可以使用此帳戶訪問Postgres。

切換到postgres帳戶

輸入以下內容切換到伺服器上的postgres帳戶:

sudo -i -u postgres

您現在可以通過鍵入以下命令立即訪問Postgres提示符:

psql

這會將您登入到PostgreSQL提示符中,從這裡您可以立即與資料庫管理系統進行互動。

輸入以下命令退出PostgreSQL提示符:

\q

這會將您帶回到postgresLinux命令提示符。

在不切換帳戶的情況下訪問Postgres提示

你也可以直接用postgres賬戶執行你想要的命令sudo

例如,在最後一個例子中,您被指示通過首先切換到postgres使用者然後執行psql以開啟Postgres提示符來訪問Postgres提示符。您可以通過psqlpostgres使用者sudo一樣執行單個命令來完成此操作,如下所示:

sudo -u postgres psql

這會將你直接登入到Postgres中,而不需要中間的bashshell。

同樣,您可以鍵入以下命令退出互動式Postgres會話:

\q

許多用例需要多個Postgres角色。繼續閱讀以瞭解如何配置這些。

建立一個新的角色

目前,您只需在資料庫中配置postgres角色。您可以使用命令從命令列建立新角色createrole。該--interactive標誌會提示您輸入新角色的名稱,並詢問它是否應具有超級使用者許可權。

如果您以postgres帳戶登入,則可以通過鍵入以下內容建立新使用者:

createuser --interactive

相反,如果您寧願使用sudo每個命令而不從普通帳戶切換,請鍵入:

sudo -u postgres createuser --interactive

該指令碼會提示您一些選擇,並根據您的響應執行正確的Postgres命令以根據您的規範建立使用者。

Output
Enter name of role to add: sammy
Shall the new role be a superuser? (y/n) y

通過傳遞一些額外的標誌可以獲得更多控制權。通過檢視man頁面檢視選項:

man createuser

你現在安裝的Postgres有一個新使用者,但你還沒有新增任何資料庫。下一節將介紹這一過程。

建立一個新的資料庫

Postgres身份驗證系統預設情況下的另一個假設是,對於用於登入的任何角色,該角色將具有可訪問的同名數據庫。

這意味著,如果您在上一節中建立的使用者名稱為sammy,則該角色將嘗試連線到預設情況下也稱為“sammy”的資料庫。您可以使用該createdb命令建立適當的資料庫。

如果您以postgres帳戶登入,則可以鍵入如下所示的內容:

createdb sammy

相反,如果您寧願使用sudo每個命令而無需從普通帳戶中切換,則可以鍵入:

sudo -u postgres createdb sammy

這種靈活性可根據需要為建立資料庫提供多種路徑

以新的角色開啟Postgres提示

要使用ident基於身份驗證的身份登入,您需要一名與Postgres角色和資料庫名稱相同的Linux使用者。

如果您沒有可用的匹配Linux使用者,則可以使用該adduser命令建立一個。您必須從您的非root使用者帳戶擁有sudo許可權(意思是,未以postgres使用者身份登入)執行此操作:

sudo adduser sammy

一旦這個新帳戶可用,您可以通過鍵入以下命令切換並連線到資料庫:

sudo -i -u sammy
psql

或者,你可以這樣做內聯:

sudo -u sammy psql

假設所有元件都已正確配置,此命令將自動登入。

如果你想讓你的使用者連線到不同的資料庫,你可以通過像這樣指定資料庫來實現:

psql -d postgres</span

登入後,您可以輸入以下內容來檢查當前的連線資訊:

\conninfo
Output
You are connected to database "sammy" as user "sammy" via socket in "/var/run/postgresql" at port "5432".

如果您連線到非預設資料庫或非預設使用者,這很有用。

建立和刪除表格

現在您已經知道如何連線到PostgreSQL資料庫系統,您可以學習一些基本的Postgres管理任務。

首先,建立一個表來儲存一些資料。作為一個例子,描述一些遊樂場裝置的表格。

該命令的基本語法如下所示:

CREATE TABLE table_name (
    column_name1 col_type (field_length) column_constraints,
    column_name2 col_type (field_length),
    column_name3 col_type (field_length)
);

正如你所看到的,這些命令為表提供了一個名稱,然後定義列以及列型別和欄位資料的最大長度。您也可以選擇為每列新增表約束。

為了演示目的,請建立一個如下所示的簡單表格:

CREATE TABLE playground (
    equip_id serial PRIMARY KEY,
    type varchar (50) NOT NULL,
    color varchar (25) NOT NULL,
    location varchar(25) check (location in ('north', 'south', 'west', 'east', 'northeast', 'southeast', 'southwest', 'northwest')),
    install_date date
);

這些命令將建立一個庫存遊樂場裝置的表格。這從一個裝置ID開始serial。此資料型別是一個自動遞增整數。你也給了這個列的約束,primary key這意味著這些值必須是唯一的而不是空的。

對於兩列(equip_idinstall_date),這些命令不指定欄位長度。這是因為某些列型別不需要設定長度,因為該型別隱含了長度。

接下來的兩個命令的裝置建立列typecolor分別,其中每一個可以不為空。這些命令之後建立一個location列並建立一個約束條件,要求該值為八個可能的值之一。最後一個命令建立一個日期列,記錄您安裝裝置的日期。

您可以輸入以下內容來檢視新表:

\d
Output
                  List of relations
 Schema |          Name           |   Type   | Owner 
--------+-------------------------+----------+-------
 public | playground              | table    | sammy
 public | playground_equip_id_seq | sequence | sammy
(2 rows)

你的遊樂場桌子在這裡,但也有一些叫做playground_equip_id_seq這種型別的東西sequence。這是serial您為equip_id專欄提供的型別的表示形式。這會跟蹤序列中的下一個數字,併為此型別的列自動建立。

如果你想只看到沒有序列的表格,你可以輸入:

\dt
Output
          List of relations
 Schema |    Name    | Type  | Owner 
--------+------------+-------+-------
 public | playground | table | sammy
(1 row)

在表中新增,查詢和刪除資料

現在您已經有了一個表格,您可以在其中插入一些資料。

例如,通過呼叫要新增的表來新增幻燈片和擺動,命名列,然後為每列提供資料,如下所示:

INSERT INTO playground (type, color, location, install_date) VALUES ('slide', 'blue', 'south', '2017-04-28');
INSERT INTO playground (type, color, location, install_date) VALUES ('swing', 'yellow', 'northwest', '2018-08-16');

輸入資料時應小心,以避免幾次常見的結束通話。例如,不要將列名換成引號,但輸入的列值需要引號。

另外要記住的是,您不輸入equip_id列的值。這是因為無論何時建立表中的新行時都會自動生成這些資料。

通過輸入以下內容檢索您新增的資訊:

SELECT * FROM playground;
Output
 equip_id | type  | color  | location  | install_date 
----------+-------+--------+-----------+--------------
        1 | slide | blue   | south     | 2017-04-28
        2 | swing | yellow | northwest | 2018-08-16
(2 rows)

在這裡,你可以看到你的equip_id成功填寫以及你所有其他資料的組織都是正確的。

如果操場上的幻燈片發生斷裂並且您必須將其刪除,則還可以鍵入以下內容以從表格中刪除該行:

DELETE FROM playground WHERE type = 'slide';

再次查詢表格:

SELECT * FROM playground;
Output
 equip_id | type  | color  | location  | install_date 
----------+-------+--------+-----------+--------------
        2 | swing | yellow | northwest | 2018-08-16
(1 row)

您注意到您的幻燈片不再是表格的一部分。

從表中新增和刪除列

建立表格後,可以對其進行修改以相對簡單地新增或刪除列。通過輸入以下內容新增一列以顯示每件裝置的上次維護訪問:

ALTER TABLE playground ADD last_maint date;

如果再次查看錶格資訊,則會看到已新增新列(但未輸入任何資料):

SELECT * FROM playground;
Output
 equip_id | type  | color  | location  | install_date | last_maint 
----------+-------+--------+-----------+--------------+------------
        2 | swing | yellow | northwest | 2018-08-16   | 
(1 row)

刪除列同樣簡單。如果您發現工作人員使用單獨的工具來跟蹤維護歷史記錄,則可以通過鍵入以下內容來刪除該列:

ALTER TABLE playground DROP last_maint;

這將刪除該last_maint列及其中找到的任何值,但保留所有其他資料不變。

更新表中的資料

到目前為止,您已經學會了如何向表中新增記錄以及如何刪除它們,但本教程尚未介紹如何修改現有條目。

您可以通過查詢您想要的記錄並將列設定為您希望使用的值來更新現有條目的值。您可以查詢“擺動”記錄(這將匹配表格中的每個擺動)並將其顏色更改為“紅色”。如果你給揮杆設定一個油漆工作,這可能是有用的:

UPDATE playground SET color = 'red' WHERE type = 'swing';

您可以通過再次查詢資料來驗證操作是否成功:

SELECT * FROM playground;
Output
 equip_id | type  | color | location  | install_date 
----------+-------+-------+-----------+--------------
        2 | swing | red   | northwest | 2010-08-16
(1 row)

正如你所看到的,你的幻燈片現在被註冊為紅色。