临时用 Compose 暴露的端口(与 .env 密码一致)
宿主机通过 Compose 映射
5433:5432连接容器内 PostgreSQL,下文示例统一使用localhost:5433。
1. 临时环境变量
$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连的那套库 里产生数据,例如:
INSERTINTO"Product"(name,price,stock)VALUES('示例',9.99,100);3. 理解 compose 文件及环境变量的关系
1. compose 里,是为了初始化一个数据库
environment:POSTGRES_USER:postgresPOSTGRES_PASSWORD:yiyi199836# 与 .env 里 DATABASE_URL 密码一致POSTGRES_DB:nodejs_study对应docker-compose.yml中的端口映射:
ports:-"5433:5432"# 宿主机 5433 → 容器内 54322. 临时环境变量
$env:DATABASE_URL="postgresql://postgres:密码@localhost:5433/nodejs_study?schema=public"执行这个命令是为了能够连接上面数据库,然后迁移的时候执行 SQL 语句建表;
如果不在当前进程中设置环境变量,就要改.env文件,连接容器或者 PostgreSQL,连哪个就要端口号、账户、密码改成对应的。