查找所有的數據庫
select datname from pg_database
運行該命令后,我們會發現其中出現了一些其它的數據庫
接下來,我們分析 template0
和 template1
的作用。
template1
template1
是 PostgreSQL 默認用于創建新數據庫的模板。當執行 CREATE DATABASE new_db;
時,PostgreSQL 實際上會復制 template1
的內容來創建 new_db
。
這意味著:
- 你可以修改
template1
:如果你在template1
中添加了表、函數、擴展或其他對象,那么之后所有基于template1
創建的新數據庫都會包含這些對象。這對于在所有新數據庫中預裝一些常用結構或擴展非常有用。 - 需要小心修改:雖然可以修改
template1
,但修改后,所有新數據庫都會繼承這些修改。如果你只想某個數據庫有特定對象,最好在創建該數據庫后再添加,而不是修改template1
。
template0
template0
也是一個模板數據庫,但它有一個關鍵特性:它被設計成一個 “純凈”的模板。
這意味著:
-
不能修改
template0
:你不能直接在template0
中添加、刪除或修改對象。 -
用于恢復或特定編碼:
template0
的主要用途是當template1
被修改后,如果你需要創建一個完全沒有任何自定義對象的新數據庫時,可以使用template0
。例如,當你需要創建使用不同字符集編碼的數據庫時,通常會基于template0
來創建,以確保編碼的一致性。
你可以通過以下方式基于template0
創建數據庫:CREATE DATABASE my_clean_db TEMPLATE template0;
簡而言之,template1
是你常用的模板,可以自定義;而 template0
是一個干凈的、不可修改的模板,用于特定情況,比如創建純凈的數據庫或者處理字符集問題。
創建更多自定義的模板
- 創建一個普通的數據庫: 首先,你需要創建一個常規的數據庫。
CREATE DATABASE my_custom_template;
-
配置你的新數據庫: 連接到這個新創建的數據庫 (
my_custom_template
),并向其中添加所有你希望在新數據庫中自動包含的對象。這包括:- 表結構(
CREATE TABLE
) - 視圖(
CREATE VIEW
) - 函數和存儲過程(
CREATE FUNCTION
) - 擴展(
CREATE EXTENSION
), 例如uuid-ossp
、pg_trgm
等。 - 預設數據(
INSERT INTO
) - 權限設置(
GRANT
)
- 表結構(
-- 添加一個擴展
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";-- 創建一個表
CREATE TABLE users (id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,email VARCHAR(100) NOT NULL
);-- 插入一些初始數據
INSERT INTO users (username, email) VALUES ('admin', 'admin@example.com');
- 將數據庫標記為模板: 完成配置后,斷開與該數據庫的所有連接。然后,你需要修改其屬性,將其標記為一個模板。這個操作需要超級用戶權限,并且不能在連接到該數據庫時執行。
update pg_database set datistemplate = true where datname = 'my_custom_template';
- 根據模板創建數據庫
create database mydb template my_custom_template
注意:
只有超級用戶才能將數據庫標記為模板。斷開連接: 在將數據庫標記為模板(
ALTER DATABASE ... IS TEMPLATE TRUE;
)之前,必須確保沒有其他會話連接到該數據庫。否則,操作會失敗。模板的修改: 理論上,你可以修改一個已經被標記為模板的數據庫。但是,當你修改它時,所有當前連接到它的會話也必須被斷開。最佳實踐是,如果你需要更新模板,可以先將它設置為
IS TEMPLATE FALSE
,進行修改,然后再設置為IS TEMPLATE TRUE
。
- 查看有哪些template
SELECT datname
FROM pg_database
WHERE datistemplate = TRUE;