
在本地安装 PostgreSQL 并上手 psql 交互式 ShellOdin 全栈课程数据库环境搭建实战【免费下载链接】curriculumThe open curriculum for learning web development项目地址: https://gitcode.com/GitHub_Trending/cu/curriculum数据持久化是绝大多数 Web 应用的核心能力而数据库正是实现这一能力的基石。本文以当前开源课程仓库中nodeJS/express/installing_postgresql.md为骨架完整讲解 PostgreSQL 的本地安装流程覆盖 Linux 与 macOS 两种主流环境、psql 交互式 Shell 的用法以及角色role、权限与认证机制的底层原理并在此基础上结合仓库中后续的 在 Express 中使用 PostgreSQL、环境变量 等课程给出从装好数据库到跑通第一个 CRUD 查询的完整链路。读完本文你将能独立在本机搭建一个可用的 PostgreSQL 开发环境并理解为何这套配置能让你在后续 Express 项目中以最省事的方式读写本地数据库。为什么 Web 应用离不开数据库数据持久化思考一个再常见不过的场景The Odin Project 这类在线学习平台中你的用户名存在哪里项目提交记录存在哪里你现在正在阅读的这篇课程内容又存在哪里答案都是数据库。数据持久化data persistence意味着数据在进程退出、服务器重启之后依然存在而这正是绝大多数 Web 应用的硬需求。要做到这一点你需要一款数据库软件来负责数据的结构化存储与查询。在本课程中团队选定了PostgreSQL作为整个课程体系的默认数据库理由很实际前面 数据库与 SQL 课程 中学习到的所有 SQL 知识都可以平滑迁移到 PostgreSQL 上因为它本身就是关系型数据库的标准实现之一课程后续的 Express 应用、Prisma ORM、部署上线环节都以它为准学一次、用全程。在动手安装之前请先确认你已经完成了 SQL 基础课程掌握CREATE TABLE、SELECT、INSERT、JOIN等语法与概念。本文以及后续所有数据库相关课程都会默认你理解 SQL 语法否则安装完成后面对psql提示符会无从下手。认识 PostgreSQL Shellpsql数据库的终端前门在安装之前先明确一个核心概念——PostgreSQL Shell即 psql。它是 PostgreSQL 自带的、基于终端的命令行前端允许用户以交互方式执行 SQL 查询并管理数据库。psql 的能力范围很广运行任意 SQL 查询SELECT、INSERT、UPDATE、DELETE等创建与修改数据库结构CREATE DATABASE、CREATE TABLE、ALTER等在纯命令行环境中与数据库交互并借助其丰富的meta-commands元命令与类 Shell 特性编写脚本、自动化大量日常任务。psql 的元命令以反斜杠\开头是安装和日常使用中最高频的一类操作常见的有元命令作用\l列出当前服务器上的所有数据库\c dbname连接到指定数据库\d显示当前数据库中的表、序列等对象\dt仅列出表\password role为指定角色设置密码\q退出 psql\?查看全部元命令帮助理解 psql 还有一个关键点通过 psql 操作的数据实际存放在本地文件系统的普通文件中PostgreSQL 将数据库以普通文件的形式存储在文件系统内而不是某个抽象的云空间。数据目录data directory的默认位置因操作系统而异Linux 通常在/var/lib/postgresql/下macOS 的 Postgres.app 则位于应用包内部但这不影响日常使用——你只需要知道数据就在本机文件系统里这一事实即可。安装前准备确认你的操作系统与包管理工具PostgreSQL 的安装方式随操作系统不同而不同。仓库提供了两份官方配套指南分别面向 Linux 与 macOSLinux 安装指南macOS 安装指南下面分别展开讲解。Linux 指南基于 Debian/Ubuntu 系的apt包管理器macOS 指南则基于 Homebrew 与 Postgres.app请务必按自己实际的操作系统选择对应章节。在 LinuxDebian/Ubuntu 系上安装 PostgreSQLLinux 下的安装分为更新系统 → 安装软件包 → 启动服务 → 配置角色与权限几个阶段。第 1 步确保系统处于最新状态安装任何软件前先把系统更新到最新避免因依赖版本过旧导致安装失败sudo apt update sudo apt upgrade第 2 步安装 PostgreSQL 软件包更新完成后安装三个关键软件包sudo apt install postgresql postgresql-contrib libpq-dev三个包的分工如下postgresqlPostgreSQL 数据库服务器本体postgresql-contrib官方提供的一系列附加扩展工具与功能模块libpq-devPostgreSQL 的 C 语言客户端库头文件node-postgrespg等驱动在编译/连接本地库时可能依赖它安装它可以让后续 Node.js 接入更顺畅。第 3 步启动服务并确认状态安装完成后用 systemd 启动 PostgreSQL 服务并查看其状态sudo systemctl start postgresql.service systemctl status postgresql.service若输出显示active (running)之类的字样说明服务已正常启动此时可按Q键退出状态查看界面进入下一步。如果服务未激活或报错需要回头检查安装步骤或查阅发行版文档排障。第 4 步创建你自己的角色rolePostgreSQL 通过角色role进行身份认证。可以简单地把角色理解成数据库层面的用户你与数据库服务交互时本质上都是以某个角色的身份进行的。默认安装会创建一个名为postgres的超级用户角色。直接使用它当然可行但那样每次操作数据库都要先切换到postgres用户非常繁琐。更优雅的做法是创建一个与你的 Linux 用户名同名的角色从而直接利用 PostgreSQL 的 peer authentication对等认证机制省去反复切换用户的麻烦。先确认自己的 Linux 用户名whoami然后创建角色--interactive会引导你输入角色名、是否设为超级用户等选项sudo -i -u postgres createuser --interactive关键点角色名要与你的 Linux 用户名完全一致并且在交互提示中把该角色设为superuser超级用户。这样配置之后你在终端里直接运行psql就能以当前 Linux 用户的身份免密登录本地数据库——这正是对等认证带来的便利数据库服务器信任与操作系统用户同名的角色。注意如果你的用户名包含大写字母在后续创建数据库的命令中必须用双引号将用户名括起来否则 PostgreSQL 会将其解析为小写并报错。第 5 步为角色创建同名数据库角色创建好后还有一个关键步骤每个角色必须拥有一个与自己同名的数据库。缺少它角色将无法登录或操作 PostgreSQL。可以现在就试着运行psql但你会看到数据库不存在之类的错误——别担心这正是预期行为。用下面的命令创建同名数据库来修复它sudo -i -u postgres createdb linux_username把linux_username替换成第 4 步查到的用户名。至此你的角色就完整了既有一个role_name角色又有一个与之对应的数据库。原理说明psql 在未显式指定数据库时会默认尝试连接与当前用户名同名的数据库。因此角色 同名数据库这一组合是运行psql即直达你的数据库这条捷径成立的前提。第 6 步为角色设置密码角色建立后为了保护数据应当为其设置一个密码。现在这个新角色已经可以直接用于管理 PostgreSQL——运行以下命令进入 psql 提示符psql你会看到提示符变成role_name#的形式#表示当前是超级用户。确认提示符无误后为该角色设置密码\password role_name系统会提示你输入密码并再次确认。完成后提示符恢复正常。第 7 步授予新角色数据库权限接下来为该角色授予其数据库的全部权限注意结尾的分号是 SQL 语句的一部分不能省略GRANT ALL PRIVILEGES ON DATABASE role_database_name TO role_name;将role_database_name与role_name都替换为你的实际名称两者应相同。如果命令成功psql 会返回GRANT。确认后输入\q退出提示符。第 8 步把密码保存为环境变量最后一步把上一步设置的密码写入环境变量供后续 Express 项目读取。运行echo export DATABASE_PASSWORDrole_password ~/.bashrc注意两点环境变量名约定为DATABASE_PASSWORD后续在 环境变量课程 中会看到Node 应用可通过process.env.DATABASE_PASSWORD读取它必须把role_password替换成你在第 6 步设置的真实密码。由于这是新添加的变量需要关闭并重新打开终端或执行source ~/.bashrc让环境重新加载之后才能访问到它。至此 Linux 端的安装与配置全部完成。在 macOS 上安装 PostgreSQLmacOS 的安装路径与 Linux 不同使用 Homebrew 更新环境再通过 Postgres.app 安装服务器本体。第 1 步更新 Homebrew在运行任何 Homebrew 命令之前先把 brew 本身和已安装的软件包更新到最新逐条执行brew update brew upgrade如果终端提示找不到brew命令说明 Homebrew 尚未安装需要先完成 Homebrew 的安装再回到本步。第 2 步通过 Postgres.app 安装 PostgreSQLPostgres.app 是 macOS 上最简单直观的 PostgreSQL 安装方式访问其官网下载并安装按官方说明操作即可。需要注意的关键配置是$PATH环境变量——只有把 Postgres.app 的 bin 目录加入$PATH才能在终端中直接调用psql等配套工具。安装时请选择可用的最新版本 PostgreSQL。安装完成后运行以下命令把 Postgres.app 的可执行文件目录写入系统的路径配置文件从而访问全部配套工具sudo mkdir -p /etc/paths.d echo /Applications/Postgres.app/Contents/Versions/latest/bin | sudo tee /etc/paths.d/postgresapp重启终端后验证路径是否配置成功which psql预期输出/Applications/Postgres.app/Contents/Versions/latest/bin/psql如果输出与此不符说明路径未生效需要检查上一步是否执行成功。⚠️安全提示Postgres.app 安装的服务器默认没有配置任何安全机制会接受所有本地连接且无需密码。这在本地开发环境中是可以接受的但请务必意识到当应用迁移到生产环境时绝不能沿用这种无认证策略。生产数据库的安全配置参考 部署课程。第 3 步确认默认角色与用户数据库Postgres.app 的一个贴心设计是它会默认创建一个与你的 macOS 用户名同名的角色和数据库。安装并配置好路径后直接运行psql你会看到提示符形如your_user#由于 Postgres.app 对所有本地连接启用了 trusted authentication信任认证本地开发环境不需要再额外设置密码认证。只需记住你后续用到的role_name就是上面提示符中显示的那个用户名。输入\q即可退出。macOS 与 Linux 配置的差异小结维度LinuxaptmacOSPostgres.app包来源apt官方源官网下载的 .app 应用服务管理systemctl start postgresql.service应用内一键启动认证方式peer authentication需配置角色/密码trusted authentication默认信任本地连接角色创建手动createuser默认自动创建与系统用户同名角色密码需手动设置并存入环境变量本地开发无需设置角色、认证与同名数据库安装配置背后的原理Linux 安装流程中的几个为什么值得展开讲透因为它们直接决定你后续使用体验是否顺畅1. 角色role就是数据库世界的用户。PostgreSQL 的一切权限控制都围绕角色展开。默认的postgres角色虽然能用但每次都要sudo -i -u postgres切换体验很差。2. 同名角色 peer authentication 的组合拳。PostgreSQL 的 pg_hba.conf 默认对本地 Unix socket 连接启用 peer 认证当操作系统用户alice以角色alice连接时服务器直接信任这个身份无需密码。因此让你的角色与 Linux 用户名同名就能实现终端里直接敲psql就能进数据库的丝滑体验。3. 为什么必须建同名数据库psql 启动时若未指定数据库名默认连接与当前用户名同名的数据库。没有这个数据库psql一启动就会报database does not exist。这就是第 5 步createdb linux_username存在的意义。4. 密码与环境变量。即使 peer 认证让本地免密可用设置密码依然是必要的一来后续node-postgres等驱动通过 TCP 连接时需要密码认证二来数据安全本身要求角色有凭据保护。把密码写入~/.bashrc中的DATABASE_PASSWORD环境变量是为了避免把凭据硬编码进代码——这正是 环境变量课程 反复强调的最佳实践敏感信息走环境变量且.env文件必须加入.gitignore。安装完成之后用 psql 验证你的数据库环境安装配置完成后建议立刻做一轮完整的冒烟测试确认环境真正可用。这一步直接复用 在 Express 中使用 PostgreSQL 中的完整流程1. 进入 psql 并查看数据库列表psql \l2. 创建一个新的数据库并连接CREATE DATABASE top_users; \c top_users连接成功后提示符应变更为top_users#。3. 创建一张带自增主键的表CREATE TABLE usernames ( id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY, username VARCHAR ( 255 ) );用\d验证表已创建你会看到输出中同时出现usernames表和usernames_id_seq序列。这个序列正是GENERATED ALWAYS AS IDENTITY的产物它把id列定义为identity column标识列PostgreSQL 会自动为每一行新数据生成id值默认从 1 开始、每次递增 1而序列对象则负责跟踪下一个要使用的值。4. 插入并查询数据INSERT INTO usernames (username) VALUES (Mao), (nevz), (Lofty); SELECT * FROM usernames;5. 退出\q这套流程跑通说明 psql、角色、权限、数据库与表结构全部工作正常可以进入下一步把数据库接入 Express 应用。安装的下一个环节用 node-postgres 把数据库接入 Express安装 PostgreSQL 只是起点。仓库的下一课 在 Express 中使用 PostgreSQL 紧接着展示了如何用node-postgresnpm 包名pg把数据库接入 Express 应用这能帮你建立安装 → 连接 → 查询的完整心智模型建立连接池Poolconst { Pool } require(pg); module.exports new Pool({ host: localhost, user: role_name, database: top_users, password: role_password, port: 5432 // PostgreSQL 默认端口 });其中role_name和role_password正是你在本课 Linux 安装流程中创建并保存到环境变量的那对凭据。更规范的做法是用 Connection URI 连接字符串并全部从环境变量读取module.exports new Pool({ connectionString: postgresql://role_name:role_passwordlocalhost:5432/top_users });理解 Client 与 Pool 的区别Client是单条手动管理的连接打开、查询、关闭适合一次性查询Pool是连接池持有若干连接并在查询时复用空闲连接非常适合 Web 服务器这种高并发查询场景——这也是课程推荐在 Express 中用Pool的原因。参数化查询防 SQL 注入插入用户输入时务必使用参数占位符而非字符串拼接await pool.query(INSERT INTO usernames (username) VALUES ($1), [username]);直接把用户输入拼进 SQL如VALUES ( username )会让恶意用户通过sike); DROP TABLE usernames; --之类的输入清空你的表这就是臭名昭著的SQL 注入。pg的参数化查询机制会替你把参数安全转义。用脚本填充数据库手动建表、插数据很繁琐课程提供了一个可复用的db/populatedb.js脚本通过connectionString连接数据库并执行建表 插入的 SQL。该脚本设计为只运行一次并且可以通过process.argv接收连接地址参数从而在同一台机器上既能填充本地库、也能在部署后填充生产库# 填充本地数据库 node db/populatedb.js local-db-url # 部署完成后从本机填充生产数据库 node db/populatedb.js production-db-url这与 本地 vs 生产数据库 的讨论一脉相承本地库适合开发交互快、可随意改动、无需联网生产库则需托管在外部服务器上以保证全球可达、可扩展与更强的安全性。后续在 测试数据库操作 中还会看到用TEST_DATABASE_URL之类的独立环境变量隔离测试库与开发库的做法——这一切都建立在你本课搭好的 PostgreSQL 环境之上。知识检查为什么数据持久化对 Web 应用至关重要什么是 PostgreSQL Shellpsql它有哪些典型用途与常用元命令在 Linux 上为什么创建与系统用户名同名的角色能简化本地数据库的使用为什么每个角色都需要一个与自己同名的数据库在 macOS 上通过 Postgres.app 安装时为什么本地开发可以跳过密码认证而生产环境绝不能这样做【免费下载链接】curriculumThe open curriculum for learning web development项目地址: https://gitcode.com/GitHub_Trending/cu/curriculum创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考