You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drizzle ORM Postgres参数绑定不匹配报错求助

Drizzle ORM查询报错修复方案

问题重现

代码

export async function fetchPaymentMethod(name: string) {
        const res = await db.select().from(PaymentMethodsTable).where(sql`lower(${PaymentMethodsTable.name}) = '${name}'`);

        return res[0];
    }

错误信息

bind message supplies 1 parameters, but prepared statement "" requires 0
    at async fetchPaymentMethod (./app/lib/data/main.ts:36:17)

问题背景

在NextJS项目中使用Drizzle ORM时,上述代码里的'${name}'写法引发参数绑定错误,原以为符合官方文档写法,寻求修复方案。

问题原因

你给参数name套了单引号后,Drizzle的sql模板引擎会把'${name}'当成普通字符串字面量处理,无法识别为需要绑定的参数。但同时你通过${PaymentMethodsTable.name}传入了一个参数,导致实际绑定的参数数量和SQL语句预期的不匹配,触发了这个错误。

修复方案

方案1:移除单引号,正确绑定参数

直接去掉name外层的单引号,让Drizzle正确识别并绑定参数:

export async function fetchPaymentMethod(name: string) {
        const res = await db.select().from(PaymentMethodsTable).where(sql`lower(${PaymentMethodsTable.name}) = ${name}`);

        return res[0];
    }

方案2:统一大小写匹配(更严谨)

如果需要忽略大小写匹配,建议对name也调用lower函数,避免因输入大小写不一致导致查询不到结果:

export async function fetchPaymentMethod(name: string) {
        const res = await db.select().from(PaymentMethodsTable).where(sql`lower(${PaymentMethodsTable.name}) = lower(${name})`);

        return res[0];
    }

替代实现(更符合ORM风格)

使用Drizzle提供的内置函数和条件构造器,避免直接写原生SQL片段,代码可读性和安全性更好:

import { eq, lower } from 'drizzle-orm';

export async function fetchPaymentMethod(name: string) {
        const res = await db.select()
            .from(PaymentMethodsTable)
            .where(eq(lower(PaymentMethodsTable.name), lower(name)));

        return res[0];
    }

内容的提问来源于stack exchange,提问作者Pedro Santos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:57:09