Skip to main content
  1. Posts/

PostgreSQL 使用手册

·498 words·3 mins· loading · loading · · ·
Develop Database
Table of Contents
Database - This article is part of a series.
Part 1: This Article

该份文档由大模型生成,仅作为参考,不作为最终文档

简介
#

PostgreSQL 是一个强大的开源对象-关系型数据库管理系统(ORDBMS)。支持 SQL 标准的同时,PostgreSQL 还扩展了存储过程、多版本并发控制(MVCC)、数据完整性等特性。作为开发者,理解并熟练使用 PostgreSQL 的高级功能对于开发和管理高效、可靠的应用程序至关重要。

安装
#

包管理器安装
#

可以通过包管理器或从源代码安装 PostgreSQL。以 Ubuntu 为例:

sudo apt update
sudo apt install postgresql postgresql-contrib

初始配置
#

安装后,启动 PostgreSQL 并设置用户及权限。

# 启动 PostgreSQL
sudo systemctl start postgresql

# 创建新用户
sudo -u postgres createuser --interactive

# 创建新数据库
sudo -u postgres createdb mydb

# 进入 PostgreSQL Shell
sudo -u postgres psql

使用 Docker 安装
#

拉镜像
#

默认的镜像版本 (latest) 是基于 Debian 镜像的,如果你希望拉取体积更小的 PostgreSQL 镜像可以拉取基于 Alpine 的:

docker pull postgres
docker pull postgres:15-alpine

创建数据卷
#

在 docker 中创建卷,用以持久化数据库的数据

docker volume create postgre-data

创建并运行容器
#

docker run -id --name=postgresql -v postgre-data:/var/lib/postgresql/data -p 5432:5432 -e POSTGRES_PASSWORD=123456 -e LANG=C.UTF-8 postgres
  • 绑定数据卷:-v postgre-data:/var/lib/postgresql/data
  • 端口:5432
  • 用户密码:POSTGRES_PASSWORD 指定密码,如果没有指明 POSTGRES_USER,则默认使用超级用户(用户名为 postgres)。
  • 指定语言,以支持中文。LANG=C.UTF-8

基础数据库操作
#

数据库与表的基本操作
#

创建数据库和表是数据库开发的第一步。

-- 创建数据库
CREATE DATABASE mydb;

-- 连接数据库
\c mydb;

-- 创建表
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100) UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

插入数据
#

使用 INSERT 语句插入数据:

INSERT INTO users (name, email) VALUES ('Alice', '[email protected]');

查询数据
#

使用 SELECT 语句查询数据:

SELECT * FROM users;

-- 条件查询
SELECT * FROM users WHERE email = '[email protected]';

更新和删除数据
#

可以使用 UPDATEDELETE 语句更新或删除记录。

-- 更新数据
UPDATE users SET name = 'Alice Updated' WHERE id = 1;

-- 删除数据
DELETE FROM users WHERE id = 1;

高级查询
#

JOIN 操作
#

PostgreSQL 支持多种 JOIN 类型(INNER JOIN, LEFT JOIN, RIGHT JOIN 等)。

-- INNER JOIN 查询
SELECT u.name, o.order_id
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

子查询
#

子查询用于在查询中嵌套其他查询。

SELECT name
FROM users
WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);

聚合函数与 GROUP BY
#

PostgreSQL 提供了丰富的聚合函数,如 COUNT, SUM, AVG, MAX, MIN 等。

SELECT COUNT(*), AVG(amount) 
FROM orders
GROUP BY user_id;

存储过程与函数
#

PostgreSQL 支持通过 PL/pgSQL 编写存储过程和函数。

-- 创建函数
CREATE OR REPLACE FUNCTION get_user_email(user_id INT) RETURNS VARCHAR AS $$
DECLARE
    user_email VARCHAR;
BEGIN
    SELECT email INTO user_email FROM users WHERE id = user_id;
    RETURN user_email;
END;
$$ LANGUAGE plpgsql;

-- 调用函数
SELECT get_user_email(1);

事务管理
#

PostgreSQL 支持事务操作,通过 BEGINCOMMITROLLBACK 语句来管理事务。

BEGIN;
    UPDATE users SET name = 'Bob' WHERE id = 2;
    INSERT INTO orders (user_id, amount) VALUES (2, 500);
COMMIT;

数据库性能优化
#

索引优化
#

索引可以显著提高查询速度。常用的索引类型包括 B-tree、GIN、GIST 等。

  • GIN 索引适用于包含多值数据类型的列,如数组、JSONB 等。
-- 创建索引
CREATE INDEX idx_users_email ON users (email);
create index retrieval_model_idx on datasets using gin(retrieval_model);

分区表
#

分区表能够提高处理大数据集的效率。

-- 创建分区表
CREATE TABLE orders_partitioned (
    order_id SERIAL,
    amount DECIMAL,
    order_date DATE
) PARTITION BY RANGE (order_date);

数据库备份与恢复
#

备份
#

PostgreSQL 提供 pg_dump 工具来进行备份。

pg_dump mydb > mydb_backup.sql

恢复
#

使用 psql 恢复备份的数据。

psql mydb < mydb_backup.sql

常用扩展插件
#

pg_stat_statements
#

用于收集查询统计信息的扩展,帮助监控数据库性能。

-- 安装插件
CREATE EXTENSION pg_stat_statements;

-- 查询统计信息
SELECT * FROM pg_stat_statements;

PostGIS
#

一个扩展用于支持地理空间数据。

-- 安装插件
CREATE EXTENSION postgis;

-- 使用地理空间数据类型
SELECT ST_AsText(geom) FROM spatial_table;

安全性
#

用户与权限管理
#

PostgreSQL 通过角色和权限控制数据库访问。

-- 创建用户
CREATE USER dev_user WITH PASSWORD 'password';

-- 赋予权限
GRANT SELECT, INSERT ON users TO dev_user;

数据加密
#

PostgreSQL 支持传输层加密(SSL),可以通过配置 postgresql.confpg_hba.conf 文件启用。

工具与资源
#

  • pgAdmin: 图形化数据库管理工具。
  • DBeaver: 跨平台 SQL 工具,支持 PostgreSQL。
  • 官方文档: PostgreSQL 官方文档.

Ref
#

awsling
Author
awsling
A Web Developer, Product Designer & Elysia’s Stalker
Database - This article is part of a series.
Part 1: This Article

Related

Peewee - Python 轻量级 ORM 框架
·312 words·2 mins· loading · loading
Develop ORM Database Python
消息队列概述
·89 words·1 min· loading · loading
Develop MQ
消息队列:Kafka
·533 words·3 mins· loading · loading
Develop MQ