Drizzle ORM 连接 Prisma Postgres 实战:prisma-examples 示例深度解析
示例工程【免费下载链接】prisma-examples Ready-to-run Prisma example projects项目地址https://gitcode.com/gh_mirrors/pr/prisma-examples点击查看免费下载导读本文基于 prisma-examples 仓库中的 databases/drizzle-prisma-postgres 示例完整讲解如何使用 Drizzle ORM第三方 TypeScript ORM直连 Prisma PostgresPrisma 托管的云数据库服务。你将掌握从模板下载、创建云数据库、配置环境变量到用 Drizzle 定义表结构、建表、执行插入/联表查询/更新等完整 CRUD 的端到端流程并理解该示例与同目录下 Prisma ORM 版示例在技术选型上的本质差异。示例定位当 Drizzle 遇上 Prisma Postgres在 prisma-examples 仓库中databases 目录集中存放了特定数据库 Prisma Postgres 集成的示例项目根 README.md 将 drizzle-prisma-postgres 描述为 Drizzle ORM with Prisma Postgres。这个示例的核心特征在于它完全不使用 Prisma Client也没有任何prisma/schema.prisma文件。项目里只有两个 TypeScript 源文件src/index.ts 与 src/schema.ts通过postgrespostgres.js 驱动建立到 Prisma Postgres 的 TCP 连接再交给 Drizzle ORM 做类型安全的查询构建。也就是说Prisma Postgres 在这里扮演的是兼容标准 PostgreSQL wire protocol 的托管数据库角色与 Prisma ORM 本身完全解耦。这与同目录下的其他示例形成了清晰的技术对照示例ORM / 工具访问数据库的方式databases/prisma-postgresPrisma ORMPrisma Client prisma/adapter-pg需要prisma/schema.prismadatabases/drizzle-prisma-postgresDrizzle ORMdrizzle-orm/postgres-js驱动无 Prisma schemadatabases/kysely-prisma-postgresKyselypg连接池 Kysely 查询构建器无 Prisma schema从仓库目录结构看后两者走的是用第三方数据访问层直连 Prisma Postgres的路线说明 Prisma Postgres 对生态中的其他 ORM 是开放兼容的。项目结构与依赖解析databases/drizzle-prisma-postgres 目录非常精简只有 4 个文件databases/drizzle-prisma-postgres/ ├── src/ │ ├── index.ts # 入口脚本建表 CRUD 全流程 │ └── schema.ts # Drizzle 表结构定义 ├── README.md # 官方使用说明 ├── package.json # 依赖与脚本 └── tsconfig.json # TypeScript 编译配置package.json 中的依赖版本仓库内实际锁定的版本drizzle-orm0.44.7Drizzle ORM 核心库postgres3.4.8postgres.js 驱动负责与 PostgreSQL/Prisma Postgres 建立连接dotenv17.3.1加载.env环境变量开发依赖tsx4.21.0直接运行 TypeScript、typescript5.9.3、types/node24.12.0脚本命令scripts: { dev: tsx src/index.ts, typecheck: tsc --noEmit }npm run dev用 tsx 直接执行 src/index.ts无需先编译npm run typecheck则用tsc --noEmit做纯类型检查。tsconfig.json 采用target: ES2022、module/moduleResolution: NodeNext并开启strict严格模式。快速开始三步跑通示例第 1 步下载模板并安装依赖使用 Prisma 官方的try-prisma工具下载该模板npx try-prismalatest --template databases/drizzle-prisma-postgres进入项目目录并安装依赖cd drizzle-prisma-postgres npm install也可以直接克隆整个 prisma-examples 仓库然后进入databases/drizzle-prisma-postgres目录执行同样的安装步骤。第 2 步创建 Prisma Postgres 数据库运行以下命令创建 Prisma Postgres 数据库npx create-dblatest命令输出中会包含连接串将其复制到项目根目录的.env文件中DATABASE_URLpostgresql://...Tip在输出提供的 URL 处认领Claim你的数据库即可让它永久保留。这一步至关重要——src/index.ts 在启动时会立即校验环境变量缺失会直接抛错if (!process.env.DATABASE_URL) { throw new Error(DATABASE_URL is not set. Add it to your .env file.); }第 3 步运行示例npm run dev脚本执行时会依次完成以下操作与 README 描述一致创建users和posts两张表若不存在创建一个用户及其关联的一篇文章查询所有已发布published的文章并内联include每篇文章的作者信息更新其中一篇文章的标题。表结构定义Drizzle 的声明式建模src/schema.ts 使用drizzle-orm/pg-core以 TypeScript 声明式方式定义两张表export const users pgTable(users, { id: serial(id).primaryKey(), email: varchar(email, { length: 255 }).notNull().unique(), name: varchar(name, { length: 255 }), }); export const posts pgTable(posts, { id: serial(id).primaryKey(), title: text(title).notNull(), content: text(content), published: boolean(published).notNull().default(false), authorId: integer(author_id) .notNull() .references(() users.id, { onDelete: cascade }), });逐字段说明users.idserial自增主键对应 PostgreSQL 的SERIAL PRIMARY KEYusers.emailvarchar(255)NOT NULL且UNIQUEusers.namevarchar(255)可空posts.idserial自增主键posts.titletextNOT NULLposts.contenttext可空posts.publishedbooleanNOT NULL默认falseposts.authorIdintegerNOT NULL外键引用users.idON DELETE CASCADE删除用户时级联删除其文章。注意authorId对应的数据库列名是author_idDrizzle 列名与属性名可不同这正体现了 Drizzle TypeScript 列名camelCase↔ 数据库列名snake_case 灵活映射的特点。连接与建表postgres.js 内联 SQL连接部分位于 src/index.ts 顶部import dotenv/config; import { drizzle } from drizzle-orm/postgres-js; import { and, eq, sql } from drizzle-orm; import postgres from postgres; import { posts, users } from ./schema; const client postgres(process.env.DATABASE_URL, { ssl: require }); const db drizzle(client);关键点ssl: require。Prisma Postgres 是托管云数据库强制要求 TLS 加密连接因此在 postgres.js 客户端上必须显式开启 SSL这也是本项目与本地自建 PostgreSQL 示例通常无需 SSL最重要的差异之一。由于示例要开箱即跑、独立运行建表工作没有依赖迁移工具而是通过 Drizzle 的db.execute(sql...)直接执行幂等的 DDLawait db.execute(sql CREATE TABLE IF NOT EXISTS users ( id serial PRIMARY KEY, email varchar(255) NOT NULL UNIQUE, name varchar(255) ) ); await db.execute(sql CREATE TABLE IF NOT EXISTS posts ( id serial PRIMARY KEY, title text NOT NULL, content text, published boolean NOT NULL DEFAULT false, author_id integer NOT NULL REFERENCES users(id) ON DELETE CASCADE ) );这里用IF NOT EXISTS保证脚本可重复执行DDL 的列定义与 src/schema.ts 中的声明式建模一一对应二者共同演示了Drizzle 模型 ↔ 实际 SQL的双向关系。在真实项目中你通常会用drizzle-kit迁移代替这段内联 DDL。CRUD 全流程插入、联表查询与更新main()函数按顺序演示了四类典型数据库操作。1. 插入用户INSERT ... RETURNINGconst [newUser] await db .insert(users) .values({ email: alice${Date.now()}prisma.io, name: Alice, }) .returning();邮箱使用alice${Date.now()}prisma.io拼接时间戳保证每次运行不撞UNIQUE约束——这是示例可反复执行的细节。.returning()是 PostgreSQL 特有的INSERT ... RETURNING语法返回插入后的整行记录若返回为空则抛错if (!newUser) { throw new Error(Failed to create user.); }2. 插入关联文章const [newPost] await db .insert(posts) .values({ title: Hello from Prisma Postgres via Drizzle!, content: This is my first post, published: true, authorId: newUser.id, }) .returning();authorId直接引用上一步插入的newUser.id演示了外键关联写入随后打印创建结果。3. 联表查询所有已发布文章及其作者const publishedPosts await db .select({ id: posts.id, title: posts.title, content: posts.content, published: posts.published, author: { id: users.id, email: users.email, name: users.name, }, }) .from(posts) .innerJoin(users, eq(posts.authorId, users.id)) .where(eq(posts.published, true));这是 Drizzle 的**嵌套投影nested select**特性通过innerJoin关联users表并利用author: {...}的对象形态把作者字段嵌套到结果中查询出的每篇文章都携带其作者对象语义上接近include author。4. 更新文章标题const [updatedPost] await db .update(posts) .set({ title: Hello from Prisma Postgres via Drizzle! (updated) }) .where(and(eq(posts.id, newPost.id), eq(posts.authorId, newUser.id))) .returning();更新条件同时限定id与authorId用and(...)组合两个相等条件确保只更新本次创建的那篇文章。收尾错误处理与连接关闭main() .catch((error) { console.error(error); process.exitCode 1; }) .finally(async () { await client.end({ timeout: 5 }); });任何异步操作失败都会打印错误并将进程退出码置为 1无论成败finally中都会调用client.end({ timeout: 5 })优雅关闭 postgres.js 连接池避免进程悬挂。更多脚本与质量保障除了npm run dev项目还提供类型检查命令npm run typecheck它运行tsc --noEmit利用 tsconfig.json 的strict模式对全部源码做类型校验可在不执行数据库操作的前提下验证 Drizzle 查询链与表结构的类型一致性。需要说明的是仓库的自动化测试体系 tests/databases.test.ts 目前通过 tests/fixtures.ts 中的testExample仅覆盖了databases/prisma-postgres与databases/turso两个示例其余需外部基础设施的示例被标记为 skip。drizzle-prisma-postgres不在该 vitest 套件内因此需要按上文步骤在本地真实 Prisma Postgres 上手动运行验证。常见问题与注意事项DATABASE_URL is not set报错说明.env文件缺失或变量名不对。确保把create-db输出的完整连接串形如postgresql://...以DATABASE_URL...形式写入项目根目录的.env。连接被拒 / SSL 相关错误Prisma Postgres 要求 TLS客户端必须保持ssl: require配置如果换成普通本地 PostgreSQL 测试可能需要去掉该选项。重复运行产生多个用户示例故意用Date.now()生成唯一邮箱因此每次运行都会插入新用户与新文章这是设计使然若想清理可手动TRUNCATE或DROP TABLE后重新执行。数据库永久性按照 README 的 Tip在create-db输出 URL 处认领数据库可使其永久保留否则临时数据库可能被回收导致后续运行失效。延伸学习想对比 Prisma ORM 官方路径可阅读 databases/prisma-postgres/README.md 及其 src/index.ts它使用PrismaClientprisma/adapter-pg需要prisma db push与prisma generate想了解另一个第三方查询构建器的写法可对比 databases/kysely-prisma-postgres/src/index.ts进一步学习可查阅 Prisma Postgres 官方文档、Drizzle ORM 官方文档并加入 Prisma Discord 社区交流反馈。赞分享示例工程【免费下载链接】prisma-examples Ready-to-run Prisma example projects项目地址https://gitcode.com/gh_mirrors/pr/prisma-examples点击查看免费下载相关推荐prisma-examples 实战用 TypeScript 脚本与 Prisma ORM 读写 Prisma Postgres 数据库prisma examples 实战用 TypeScript 脚本与 Prisma ORM 读写 Prisma Postgres 数据库 导读 本文围绕 pr示例工程基于 Fastify 与 Prisma Postgres 的 REST API 实战prisma-examples 之 orm/fastify 全解析基于 Fastify 与 Prisma Postgres 的 REST API 实战prisma examples 之 orm/fastify 全解析 本篇指示例工程SvelteKit Prisma ORM 全栈实战从零搭建基于 Prisma Postgres 的示例应用SvelteKit Prisma ORM 全栈实战从零搭建基于 Prisma Postgres 的示例应用 本指南以 prisma examples 仓库示例工程上一篇RFHunter v4.01更新日志新增显示屏恢复机制详解下一篇3步掌握Docling让AI轻松读懂所有文档格式创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考