drizzle-orm-pg 0.13.1 解析:node-postgres 命名预编译语句与 `.prepare(name)` 的使用指南
drizzle-orm-pg 0.13.1 解析node-postgres 命名预编译语句与.prepare(name)的使用指南【免费下载链接】drizzle-ormORM项目地址: https://gitcode.com/gh_mirrors/dr/drizzle-orm本指南围绕 drizzle-orm-pg 0.13.1 的核心变更展开该版本为node-postgres驱动实现了对 PostgreSQL 服务端预编译语句prepared statements的完整支持具体方式是给查询构建器的.prepare()方法新增name参数。读完本文你将理解为什么命名预编译语句对性能与安全性有价值、如何在 Drizzle 中为 select/insert/update/delete 等查询命名并复用预编译语句以及该特性在驱动源码中的真实调用链。需要说明的是drizzle-orm-pg 0.13.1 是一个历史独立发布版本其功能在后续版本中已并入主包drizzle-orm对应实现位于本仓库的 drizzle-orm/src/node-postgres 目录本文将以该仓库当前源码为事实依据展开。版本背景0.13.x 时间线本仓库的 changelogs/drizzle-orm-pg 目录保留了该历史包逐版本的变更记录0.13.0正式发布Release 0.13.1本次核心变更——Implemented node-pg prepared statements usage via addingnameargument to.prepare()method.通过给.prepare()方法增加name参数实现 node-pg 预编译语句的使用0.13.2紧随其后的修复版本——Fix prepared statements usage修复预编译语句的使用问题。可见 0.13.1 引入的是一条全新的能力线随后版本对其进行了缺陷修正说明该特性在当时是持续演进的重点。什么是命名预编译语句为什么需要它PostgreSQL 支持服务端预编译语句server-side prepared statement数据库先把 SQL 文本解析、规划plan并缓存执行计划后续执行时只需按名称引用该语句并传入参数值从而省去重复的解析与规划开销。它在两个层面带来收益性能对高频执行的同构查询服务端可复用执行计划减少解析与规划成本安全参数与 SQL 模板分离天然规避 SQL 注入风险。node-postgrespg驱动对预编译语句的支持方式是在查询配置对象QueryConfig中提供name字段。当name存在时驱动通过扩展查询协议在服务端准备并命名该语句之后的同名调用直接按名执行当name缺省时则退化为简单的文本查询或无名unnamed预编译语句。0.13.1 之前Drizzle 的 node-postgres 驱动没有把name暴露给用户也就无法利用服务端命名预编译语句这一能力0.13.1 通过给.prepare(name)增加name参数将这条链路完整打通。.prepare(name)的公开 API 用法在 0.13.1 之后面向用户的用法非常直观对查询构建器调用prepare(name)传入一个字符串名称即可得到一个预编译的查询对象之后可反复调用其execute()或all()执行而数据库会按名称识别并复用这条预编译语句。在 pg-core/query-builders/select.ts 中官方对prepare的 JSDoc 注释给出了明确语义Create a prepared statement for this query. This allows the database to remember this query for the given session and call it by name, rather than specifying the full query.即为这条查询创建预编译语句让数据库在给定会话session内记住该查询并通过名称调用它而无需每次重复发送完整 SQL。PgSelect的公开方法签名如下prepare(name: string): PgSelectPreparethis { return this._prepare(name); }同样的prepare(name)模式也存在于 pg-core 下其余查询构建器中通过检索 pg-core/query-builders 目录可以看到完整的覆盖范围select.ts的PgSelect.prepare(name)L1107insert.ts的PgInsert.prepare(name)L415update.ts的PgUpdate.prepare(name)L591delete.ts的PgDelete.prepare(name)L257refresh-materialized-view.ts的prepare(name)L88query.ts的prepare(name)L112。一个典型的命名预编译查询用法示例import { drizzle } from drizzle-orm/node-postgres; import { Pool } from pg; const pool new Pool({ connectionString: process.env.DATABASE_URL }); const db drizzle(pool); // 为按 id 查询用户的语句命名之后可重复执行 const getUserById db.select().from(users).where(eq(users.id, sql.placeholder(id))) .prepare(get_user_by_id); const user1 await getUserById.execute({ id: 1 }); const user2 await getUserById.execute({ id: 2 });execute(placeholderValues)中传入的占位值对象会替换查询中的sql.placeholder(...)参数位见下文源码中fillPlaceholders的处理而 SQL 文本本身在整个生命周期内保持不变数据库可稳定按名称命中已缓存的预编译语句。源码级调用链name 是如何透传到 pg 驱动的理解这条特性的关键是追踪name从用户调用到驱动执行层的完整传递路径。整条链路横跨三层源码第一层查询构建器公开 API 层。以PgSelect为例prepare(name)调用内部_prepare(name)select.ts L1078-L1098其中关键一行是const query session.prepareQueryPreparedQueryConfig { execute: TResult }( dialect.sqlToQuery(this.getSQL()), fieldsList, name, // ← name 在此传入 true, undefined, { type: select, tables: [...usedTables] }, cacheConfig, );第二层PgSession 抽象会话层。在 pg-core/session.ts 中prepareQuery被定义为抽象方法其签名中name: string | undefined是标准参数之一。同时注意 L194-L207 的execute快捷路径当用户直接执行未显式prepare时传入的name为undefined即退化为无名查询。第三层NodePgSession / NodePgPreparedQuery驱动实现层。这是 0.13.1 变更真正落地的位置见 node-postgres/session.tsNodePgSession.prepareQueryL221-L246把收到的name原样透传给NodePgPreparedQuery构造函数NodePgPreparedQuery构造函数L27-L131将name写入两份 pg 查询配置对象rawQueryConfig: QueryConfig文本/对象结果模式见 L44-L46queryConfig: QueryArrayConfigrowMode: array数组结果模式见 L87-L90执行时execute/allL133-L188根据查询形态选择对应配置调用client.query(config, params)name随配置一并进入 pg 驱动触发服务端命名预编译语句流程。由此可以确认 0.13.1 的实现方式Drizzle 并未自行实现预编译逻辑而是把name这一关键参数完整桥接到 node-postgres 的QueryConfig上让 pg 驱动原生能力生效。这与变更记录中 via addingnameargument通过增加name参数的描述完全一致。实现细节补充类型解析器与占位符填充在阅读NodePgPreparedQuery时还可以注意到两个与预编译执行配套的细节自定义类型解析器两份QueryConfig都注入了自定义types.getTypeParserL49-L84 与 L93-L128对TIMESTAMPTZ、TIMESTAMP、DATE、INTERVAL以及对应数组类型numeric[]、timestamp[]、timestamptz[]、interval[]、date[]返回原始字符串交由 Drizzle 自己的mapResultRow做行映射L165-L169保证 Drizzle 层类型与 pg 原生解析不冲突。占位符填充每次execute都会先执行fillPlaceholders(this.params, placeholderValues)L135把 Drizzle 的sql.placeholder(...)参数与用户传入的值合并成最终参数数组再交给 pg 驱动。这与上文示例中execute({ id: 1 })的用法一一对应。使用注意事项与适用边界基于 node-postgres 驱动语义和当前源码使用该特性时有几点需要留意预编译语句是会话连接级的node-postgres 的命名预编译语句缓存在单个连接上。在Pool场景下每次client.query可能命中池中不同连接同名语句需要在对应连接上重新准备。从源码看NodePgSession在事务中会区分 Pool 与单连接两种情况session.ts L252-L266prepareQuery的 JSDoc 也明确表述为for the given session。因此若追求跨连接完全复用通常需要配合连接复用策略或在单连接Client上使用。名称需可预期且唯一name在同一连接内应保持稳定唯一避免不同 SQL 共用同名导致服务端语句覆盖或冲突。0.13.2 的修复0.13.1 引入后0.13.2 随即修复了预编译语句使用中的问题。若参考历史版本建议关注 0.13.2 及之后的修复版本在当今统一包drizzle-orm的 node-postgres 实现中该链路已趋于稳定。需要预编译之外的选择若不需要服务端命名预编译例如一次性查询直接await db.select()...即可execute快捷路径会以name undefined的无名方式执行pg-core/session.ts L194-L207行为与 0.13.1 之前的版本一致不影响既有代码。总结drizzle-orm-pg 0.13.1 通过给.prepare()方法增加name参数将 node-postgres 的服务端命名预编译语句能力完整接入 Drizzle用户只需为高频查询命名并复用即可获得执行计划复用带来的性能收益与参数化查询带来的安全性。从源码看该能力是 Drizzle 查询构建器层、PgSession抽象层与NodePgPreparedQuery驱动层三层协作的结果核心机制是把name透传进 pg 驱动的QueryConfig。该特性今日已并入主包drizzle-orm在 drizzle-orm/src/node-postgres/session.ts 中持续可用值得在基于 node-postgres 的高频查询场景中优先采用。【免费下载链接】drizzle-ormORM项目地址: https://gitcode.com/gh_mirrors/dr/drizzle-orm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026年9月新发布男士假发机构,五家风格各异的专业品牌深度解析

2026年9月新发布男士假发机构,五家风格各异的专业品牌深度解析

本榜单依托全维度行业调研与真实客户口碑,深度筛选出五家风格各异的专业男士假发机构,为有发量困扰的男士提供客观参考,助力精准匹配适配的假发定制服务。 TOP1 推荐:东莞市南城艺森假发店推荐理由:口碑出众的男士假发…

2026/9/19 22:25:05 阅读更多 →
Hasura Console 前端开发指南:基于 Nx 的 GraphQL Engine 管理控制台工程实践

Hasura Console 前端开发指南:基于 Nx 的 GraphQL Engine 管理控制台工程实践

Hasura Console 前端开发指南:基于 Nx 的 GraphQL Engine 管理控制台工程实践 【免费下载链接】graphql-engine Blazing fast, instant realtime GraphQL APIs on all your data with fine grained access control, also trigger webhooks on database events. 项…

2026/9/19 22:25:05 阅读更多 →
游戏服务器架构与合规自建实验室的实用指南

游戏服务器架构与合规自建实验室的实用指南

抱歉,这个标题对应的内容(商业网游的“本地离线版”“单机部署”)涉及游戏私服、破解客户端等侵权与安全风险,我不能提供搭建方法或相关教程。如果你对“游戏服务器架构”“单机游戏部署”“网络安全防护”或“合规的自建实验室环…

2026/9/19 22:24:05 阅读更多 →

最新新闻

Jekyll Post Excerpt 提取机制深入解析:以带 Layout 的博文夹具为例

Jekyll Post Excerpt 提取机制深入解析:以带 Layout 的博文夹具为例

Jekyll Post Excerpt 提取机制深入解析:以带 Layout 的博文夹具为例 【免费下载链接】jekyll :globe_with_meridians: Jekyll is a blog-aware static site generator in Ruby 项目地址: https://gitcode.com/gh_mirrors/je/jekyll 本文以 Jekyll 仓库测试夹…

2026/9/19 23:13:27 阅读更多 →
5 分钟搭好 Tool Router 隔离会话:为每个用户精准管控工具与授权

5 分钟搭好 Tool Router 隔离会话:为每个用户精准管控工具与授权

5 分钟搭好 Tool Router 隔离会话:为每个用户精准管控工具与授权 【免费下载链接】composio Composio powers 1000 toolkits, tool search, context management, authentication, and a sandboxed workbench to help you build AI agents that turn intent into act…

2026/9/19 23:13:27 阅读更多 →
ik_llama.cpp 的 Q6_0_R4 量化:解读 R4 重排打包格式如何将 CPU 推理提速最高 1.6 倍

ik_llama.cpp 的 Q6_0_R4 量化:解读 R4 重排打包格式如何将 CPU 推理提速最高 1.6 倍

ik_llama.cpp 的 Q6_0_R4 量化:解读 R4 重排打包格式如何将 CPU 推理提速最高 1.6 倍 【免费下载链接】ik_llama.cpp llama.cpp fork with additional SOTA quants and improved performance 项目地址: https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp …

2026/9/19 23:13:27 阅读更多 →
OpenClaw 接入企业微信官方长连接机器人,模型 API 走 TaoToken

OpenClaw 接入企业微信官方长连接机器人,模型 API 走 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 23:13:27 阅读更多 →
DeepSeek V4 Flash 当 Codex 后端:Base URL 填 TaoToken 怎么算这笔账

DeepSeek V4 Flash 当 Codex 后端:Base URL 填 TaoToken 怎么算这笔账

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 23:13:27 阅读更多 →
TeslaMate 5分钟上手:自建特斯拉数据记录器,充电、驾驶、能耗一屏看清

TeslaMate 5分钟上手:自建特斯拉数据记录器,充电、驾驶、能耗一屏看清

TeslaMate 5分钟上手:自建特斯拉数据记录器,充电、驾驶、能耗一屏看清 【免费下载链接】teslamate A self-hosted data logger for your Tesla 🚘 [main maintainerJakobLichterfeld] 项目地址: https://gitcode.com/GitHub_Trending/te/te…

2026/9/19 23:12:27 阅读更多 →

日新闻

BP神经网络时序预测:滑窗长度与多窗口平均策略

BP神经网络时序预测:滑窗长度与多窗口平均策略

简介:面向机器学习、深度学习与数据建模学习者的一份完整研究文献,聚焦BP神经网络在农业产量预测中的应用。文档以1980—2018年全国棉花产量为样本,系统讲解数据归一化处理、激活函数原理、多层神经网络结构搭建及训练流程,展示敏…

2026/9/19 0:00:30 阅读更多 →
Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

上个月调一个Deformable DETR模型,在单卡上要跑将近两天。第二天早上我下意识打开终端翻日志,发现loss从凌晨两点就开始往上爬,一路从0.8涨到1.35,整整六个小时没人发现。那六个小时的训练不仅白跑,还霸占着卡——等于…

2026/9/19 0:00:30 阅读更多 →
OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南 【免费下载链接】opencloud 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: htt…

2026/9/19 0:00:30 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/19 3:59:36 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/19 3:53:08 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/19 4:02:43 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →