我在 Windows 上折腾 PostgreSQL 的真实经历:从安装失败到跑通第一张表

85 阅读5分钟

作为一个纯 Windows 开发者(不用 WSL,不用 Docker),去年我想给自己的博客项目配个正经数据库。听说 PostgreSQL 比 SQLite 强,比 MySQL “更严谨”,那就试试吧。

结果光是安装就让我重装了三次。

第一次安装:官网下载,但卡在“创建超级用户”

我去了 www.postgresql.org/download/wi…
点进去,它推荐用 EnterpriseDB 安装包(也就是 www.enterprisedb.com/downloads/p…)。

下载的是个 .exe 文件,双击运行,图形化安装界面,看着挺友好。

一路下一步,直到这一步:

Password for superuser 'postgres':
(请输入超级用户 postgres 的密码)

我随便输了个 123456,继续。

然后它开始安装,进度条走完,最后弹出一个框:

Failed to load SQL modules into the database cluster

我傻了。重试?不行。卸载重装?还是这个错。

后来才知道——Windows 防火墙或杀毒软件(比如 360、Defender)可能阻止了 PostgreSQL 初始化数据库

✅ 正确做法(亲测有效):

  1. 关闭所有杀毒软件(临时禁用 Windows Defender 实时保护)
  2. 右键安装程序 → “以管理员身份运行”
  3. 密码别太简单(我后来改成 Postgres@2024,带大小写+符号)
  4. 安装路径不要有中文或空格(比如别装在 D:\我的软件

第二次安装,成功了!


启动 pgAdmin:终于看到图形界面

安装完成后,开始菜单里多了两个东西:

  • SQL Shell (psql)  → 命令行
  • pgAdmin 4 → 图形管理工具(浏览器打开)

我点了 pgAdmin 4,自动弹出浏览器,地址是 http://127.0.0.1:5050

第一次登录要设 pgAdmin 的登录账号(不是数据库账号!),我又输了个邮箱和密码。

进去后,左边有个 Servers → PostgreSQL 16,点开要输刚才设的 数据库超级用户密码(就是安装时那个 postgres 的密码)。

输对了,就能看到数据库列表。

💡 提醒:pgAdmin 账号 ≠ 数据库账号,很多人在这里混淆。


用 psql 命令行:黑窗口其实挺好用

虽然 pgAdmin 很直观,但我还是想试试命令行——因为部署时服务器上只有命令行。

在开始菜单搜  “SQL Shell (psql)” ,点开,会弹出几个配置:

text

Server [localhost]:
Database [postgres]:
Port [5432]:
Username [postgres]:
Password for user postgres:

全部默认回车,最后输密码(就是安装时设的那个)。

成功进入后,看到:

text

postgres=#

这时候就可以敲 SQL 了!

常用命令(注意前面是反斜杠 ``,不是 /):

表格

命令作用
\l列出所有数据库
\c xuebi连接到叫 xuebi 的数据库
\dt显示当前数据库所有表
\d users查看 users 表结构
\q退出

⚠️ 注意:这些命令不能加分号\l; 是错的,必须 \l


建数据库和表:踩了字段命名的坑

我想建个自己的数据库:

sql

CREATE DATABASE xuebi WITH OWNER postgres ENCODING 'UTF8';

然后 \c xuebi 切过去。

接着建 users 表:

sql

CREATE TABLE users (
    id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    name VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
);

没问题。

但建 posts 表时,我写了:

sql

CREATE TABLE posts (
    id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    content TEXT,
    userId BIGINT NOT NULL,  -- 这里埋雷了!
    FOREIGN KEY (userId) REFERENCES users(id)
);

插入数据时出错:

sql

INSERT INTO posts (title, content, userId) VALUES ('测试', '内容', 1);

报错:

text

ERROR: column "userid" does not exist

为什么?因为 PostgreSQL 在没加引号的情况下,会把字段名自动转成小写
你写 userId,它存成 userid;但插入时又按 userId 找,找不到。

✅ 解决方案(二选一):

方案一(推荐):全用下划线命名(Windows 开发者最省心)

sql

-- 建表
CREATE TABLE posts (
    id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    content TEXT,
    user_id BIGINT NOT NULL,  -- 全小写 + 下划线
    FOREIGN KEY (user_id) REFERENCES users(id)
);

-- 插入
INSERT INTO posts (title, content, user_id) VALUES ('测试', '内容', 1);

方案二:加双引号保留大小写(麻烦,但能匹配前端字段)

sql

-- 建表
CREATE TABLE posts (
    "userId" BIGINT NOT NULL,  -- 必须加引号
    FOREIGN KEY ("userId") REFERENCES users(id)
);

-- 插入也得加引号(其实在 INSERT 里不用,但 SELECT 要)
SELECT "userId" FROM posts;

🙅‍♂️ 我的建议:在 Windows + Node.js 项目里,直接用 user_id。前端拿到 JSON 后,用 Axios 的 transformResponse 或 TypeScript 类型映射转成 userId 就行,数据库层保持简洁。


连接数据库:Node.js 里怎么配?

我在项目里装了 pg(node-postgres):

bash

npm install pg

然后写连接代码:

js

const { Client } = require('pg');

const client = new Client({
  host: 'localhost',
  port: 5432,
  user: 'postgres',
  password: '你安装时设的密码',
  database: 'xuebi'
});

client.connect();

第一次跑,报错:

text

password authentication failed for user "postgres"

查了半天,发现是 pg_hba.conf 配置问题。但作为新手,我不敢乱改配置文件。

✅ 最简单的办法:

在 pgAdmin 里:

  1. 右键你的数据库 → Properties
  2. 看 Connection 标签页,确认端口是 5432
  3. 确保你用的密码就是安装时设的那个

或者,直接在 psql 里改密码:

sql

ALTER USER postgres PASSWORD '新密码';

总结:Windows 上用 PostgreSQL 的真心话

  • ✅ 用 EnterpriseDB 安装包,别自己编译
  • ✅ 关杀毒软件 + 管理员运行,避免初始化失败
  • ✅ 字段名全用小写+下划线user_id),省掉引号烦恼
  • ✅ pgAdmin 看结构,psql 跑脚本,两者配合
  • ❌ 别信网上那些 sudo service postgresql start —— 这是 Linux 命令,Windows 用不了

现在,我的博客后台稳稳跑在 PostgreSQL 上。虽然只是本地开发,但每次 \dt 看到那几张表,就觉得——数据是真的,不是内存里的幻觉

如果你也在 Windows 上起步,别怕。装一次,错几次,改几次,就成了。

加油,兄弟。