96SEO 2026-06-15 20:52 17
小聊:Drizzle ORM + Hono + PostgreSQL
说实话,这组合听起来像是把新鲜出炉的披萨配上辣酱。
哈哈,别担心,我不是要给你上高大上的技术课。

咱就是说这玩意儿上手其实挺萌的。
先别急,先把环境弄好,再慢慢撸代码。
一、Docker 把 PostgreSQL 装进容器为什么用 Docker 而不是本机装?
因为 Docker Neng一次性搞定依赖,环境一致,团队冲突少。
打开终端,写个 docker-compose.yml,内容大概长这样:
services:
postgres:
image: postgres:15
container_name: my_pg
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: secret
POSTGRES_DB: demo_db
ports:
- "5432:5432"
volumes:
- pg_data:/var/lib/postgresql/data
volumes:
pg_data:
保存后跑 docker compose up -d。
等容器起飞,就相当于有了一个干净的 PostgreSQL 实例。
二、Drizzle ORM 基础入门先装依赖:
pnpm add drizzle-orm pg drizzle-kit
再建个连接文件 src/db/index.ts
import { drizzle } from 'drizzle-orm/postgres-js';
import postgres from 'postgres';
const connectionString = process.env.DATABASE_URL!;
if throw new Error;
const client = postgres;
export const db = drizzle;
.env 里写上 DATABASE_URL=postgresql://postgres:secret@localhost:5432/demo_db。
在 src/db/schema.ts 写下:
import { pgTable, uuid, varchar, text, timestamp } from 'drizzle-orm/pg-core';
export const chats = pgTable('chats', {
id: uuid.defaultRandom.primaryKey,
title: varchar.notNull,
system_prompt: text,
created_at: timestamp.defaultNow.notNull,
updated_at: timestamp.defaultNow.notNull,
});
.returning Neng让 INSERT/UPDATE 顺带返回完整记录,省事儿。
C.R.U.D 示例:简洁又直观插入一条记录:
const = await db
.insert
.values
.returning; // 🎉直接拿到新行数据
查询所有聊天:
const all = await db.select.from;
条件查询:
const one = await db
.select
.from
.where);
geng新
await db
.update
.set
.where)
.returning;
删除记录:
await db.delete.where);
事务处理:一次操作全成功或全回滚
await db.transaction => {
await tx.insert.values;
await tx.insert.values;
}); // 任意一步报错,全撤销,安全感满满。
三、Hono 快速搭建 API 路由层
Pnpm 安装 Hono:
pnpm add hono
Create :
import { Hono } from 'hono';
import { db } from './db';
import { chats } from './db/schema';
import { eq } from 'drizzle-orm';
const app = new Hono;
app.get => {
const list = await db.select.from;
return c.json;
});
app.post => {
const body = await c.req.json;
const = await db.insert.values.returning;
return c.json;
});
app.put => {
const id = c.req.param;
const payload = await c.req.json;
const = await db
.update
.set
.where)
.returning;
return c.json;
});
app.delete => {
const id = c.req.param;
await db.delete.where);
return c.text;
});
export default app;
Boom!几行代码,一个完整的增删改查 API 就上线啦。
Lambdas 与 Cloudflare Workers 的兼容性Cf Workers 原生支持 Hono,你只要把这段代码部署到 Workers,就Neng享受无服务器的快感。
四、性Neng小技巧:别让 DB 成为瓶颈- 批量插入用一次性 `.values`,不要在循环里单条 insert。
- 合理使用索引,尤其是经常查询的列,如 `title` 或 `created_at`。
- `.returning` 虽好,但Ru果不需要返回值,就省掉它,省点网络流量。
"为什么百度不收录" 的小插曲 🤔*问:我写的博客页面经常被百度抓不到,是不是 SEO Zuo得不好?*
*答:其实大多数情况是因为页面没有 SSR,搜索引擎只Nengkan到空白的 JS 包裹体。解决办法是给关键内容加上静态 HTML 或者使用 pre-render。*
五、调试与可视化工具——Drizzle Studio 小玩意儿`pnpm run db:studio # 启动本地 UI 界面
# 浏览器会打开 http://localhost:5555
# 在这里Ke以直接执行 SQL、查kan表结构、跑迁移脚本。
Migrations:从 schema 到真实表结构的桥梁
{
"scripts": {
"db:g": "drizzle-kit generate",
"db:m": "drizzle-kit migrate",
"db:p": "drizzle-kit push"
}
}
`push` 用于开发阶段快速同步;`generate + migrate` 用于生产环境留痕审计。
六、常见坑点 & 小经验分享
- 别忘了在 `.env` 加 `PGSSLMODE=disable` 本地调试geng顺畅。
- UUID 用 `defaultRandom`,别自己在业务层生成,否则会失去数据库唯一性保障。- 当你想在查询里使用原始函数时用 `sql\`…\`` 包裹,不要直接写 JS 表达式,否则 Drizzle 会报错“不认”。
- 多表关联Ke以用 `leftJoin`,但记得在 select 时显式列出字段,否则返回类型会变成 any。
- Ru果遇到 “column does not exist” 错误,大概率是因为表名用了驼峰而 DB 默认 snake_case,检查一下映射关系吧。
- Zui后一点,小心 `.returning` 在 MySQL 上不支持,Ru果以后换库记得 成两步 SELECT+INSERT。
七、撸起袖子一起干吧!🚀Ciao~ 咱们Yi经把 Drizzle ORM 的强大模型和 Hono 的轻量路由融合进 PostgreSQL,实现了从本地 Docker 到云端 Serverless 的全链路示例。
و✧ 好了不多说了你赶紧去实验吧!Ru果卡住了记得回来找我,我这还有一堆坑等着聊呢~
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback