Docker - 04 - 连接postgres容器并迁移

临时用 Compose 暴露的端口(与 .env 密码一致)

宿主机通过 Compose 映射 5433:5432 连接容器内 PostgreSQL,下文示例统一使用 localhost:5433

1. 临时环境变量

powershell 复制代码
$env:DATABASE_URL="postgresql://postgres:你的密码@localhost:5433/nodejs_study?schema=public"

这行只在 当前 PowerShell 窗口(Windows 本机) 里设了一个临时环境变量。

环境变量优先级

情况 用哪个
PowerShell 里先执行了 $env:DATABASE_URL=... 用进程里的(当前终端临时值)
没设 $env:DATABASE_URL .env 加载(dotenv/config)
两个都有 进程环境变量优先(dotenv 通常不覆盖已存在的变量)

✅ 实际流程

实际发生的是:

复制代码
┌─────────────────────────────────────────────────────────┐
│  Windows 本机                                            │
│                                                         │
│  ① npx prisma migrate deploy 启动(Node 进程,在本机)     │
│  ② 读 DATABASE_URL → 知道连 localhost:5433               │
│  ③ 读项目里 prisma/migrations/*.sql(文件在本机磁盘)     │
│  ④ 通过 TCP 连 localhost:5433                            │
│         │                                               │
│         ▼  Docker 端口转发                               │
│  ┌──────────────────────────────────┐                   │
│  │  nodejs-postgres 容器             │                   │
│  │  PostgreSQL 监听 容器内 :5432      │                   │
│  │  数据存在 pgdata 卷里              │                   │
│  │                                  │                   │
│  │  ⑤ 收到 SQL:CREATE TABLE ...     │                   │
│  │  ⑥ 在容器自己的库里执行、存数据       │                   │
│  └──────────────────────────────────┘                   │
└─────────────────────────────────────────────────────────┘

迁移程序在本机,SQL 文件在本机,容器只负责执行 SQL 并保存结果。

Prisma CLI 会:

  • DATABASE_URL 连上数据库
  • _prisma_migrations 表,看哪些迁移已执行
  • 对未执行的迁移,逐条发送 SQL
  • 记录迁移历史

2. 迁移 SQL 能建表,不会产生数据

只有 migration 文件里 本身写了 数据类 SQL,deploy 时才会在 当前 DATABASE_URL 连的那套库 里产生数据,例如:

sql 复制代码
INSERT INTO "Product" (name, price, stock) VALUES ('示例', 9.99, 100);

3. 理解 compose 文件及环境变量的关系

1. compose 里,是为了初始化一个数据库

yaml 复制代码
environment:
  POSTGRES_USER: postgres
  POSTGRES_PASSWORD: yiyi199836 # 与 .env 里 DATABASE_URL 密码一致
  POSTGRES_DB: nodejs_study

对应 docker-compose.yml 中的端口映射:

yaml 复制代码
ports:
  - "5433:5432" # 宿主机 5433 → 容器内 5432

2. 临时环境变量

powershell 复制代码
$env:DATABASE_URL="postgresql://postgres:密码@localhost:5433/nodejs_study?schema=public"

执行这个命令是为了能够连接上面数据库,然后迁移的时候执行 SQL 语句建表;

如果不在当前进程中设置环境变量,就要改 .env 文件,连接容器或者 PostgreSQL,连哪个就要端口号、账户、密码改成对应的。