御风灰灰
Published on 2025-10-27 / 15 Visits
0
0

PostgresSQL数据库

部署容器

docker版本

部署脚本

postgresql:
    image: postgres:12-alpine
    container_name: postgresql
    restart: always
    user: 1026:100
    network_mode: host
    environment:
        POSTGRES_DB: postgres
        POSTGRES_USER: "root"
        POSTGRES_PASSWORD: "123456"
    volumes:
        - ./postgresql/data:/var/lib/postgresql/data
        - ./postgresql/custom.conf:/etc/postgresql/custom.conf:ro
    command: postgres -c config_file=/etc/postgresql/custom.conf

容器相关操作

  1. 从宿主机登录容器数据库
    # psql -h <HOST> -U <USER> -d <DBNAME> 
    docker exec -it <容器Id> psql -U root -d postgres
    

数据库操作

数据库操作

  1. 查看数据库

    \l
    
  2. 退出数据库

    \q
    
  3. 创建用户

# <user_demo> 替换为自己的用户名
#  '123456' 替换为自己的密码
CREATE ROLE <user_demo> LOGIN PASSWORD '123456';
  1. 创建数据库
# <db_name> 替换为数据库名称
# <user> 替换为用户名
CREATE DATABASE <db_name> OWNER <user>;
  1. 切换数据库
\c 库名
  1. 查看表
    \dn             -- 看有哪些 schema
    \dt *.*         -- 列出所有 schema 的所有表
    \dt myschema.*  -- 只看指定 schema
    

常用操作

  1. 查询
SELECT * FROM 表名 WHERE 条件;
  1. 删除
DELETE FROM 表名 WHERE 条件;
  1. 修改
UPDATE 表名
SET    status = 'done'
WHERE  id = 123;

操作示例

数据库迁移

导出数据库

pg_dump -U postgres -d ledger_db \
  -n public \
  --no-owner \
  --no-privileges \
  --no-acl \
  > ledger_export.sql

转换Schema名称

# 创建新 schema 版本(public → ledger)
sed 's/public\./ledger./g; s/SCHEMA public/SCHEMA ledger/g' ledger_export.sql > ledger_final.sql

# 验证
grep -n "CREATE TABLE" ledger_final.sql | head -5
# 应显示:CREATE TABLE ledger.xxx

目标库初始化

-- 以管理员执行
\c postgres

-- 创建数据库
DROP DATABASE IF EXISTS ledger_new;
CREATE DATABASE ledger_new;

-- 连接新库
\c ledger_new

-- 创建专用 schema(不用 public)
CREATE SCHEMA ledger;

-- 创建应用用户(非超级用户)
CREATE USER ledger_app WITH PASSWORD 'YourStrongPassword123!';

-- 权限配置
GRANT USAGE ON SCHEMA ledger TO ledger_app;
GRANT CREATE ON SCHEMA ledger TO ledger_app;
ALTER DEFAULT PRIVILEGES IN SCHEMA ledger GRANT ALL ON TABLES TO ledger_app;
ALTER DEFAULT PRIVILEGES IN SCHEMA ledger GRANT ALL ON SEQUENCES TO ledger_app;

-- 设置默认搜索路径
ALTER USER ledger_app SET search_path TO ledger, public;

导入数据

psql -U ledger_app -d ledger_new < ledger_final.sql

Comment