查找所有的数据库
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;