节点位置:命名参数查询(nodejs)

ve7v8dk2  于 2022-12-12  发布在  Node.js
关注(0)|答案(4)|浏览(154)

我过去常常在SQL查询中命名参数,因为实际的原因,比如在php中使用PDO。
那么我可以在node-postgres模块中使用命名参数吗?
现在,我看到许多例子和文档在互联网上显示这样的查询:

client.query("SELECT * FROM foo WHERE id = $1 AND color = $2", [22, 'blue']);

但这也是正确的吗?

client.query("SELECT * FROM foo WHERE id = :id AND color = :color", {id: 22, color: 'blue'});

或此

client.query("SELECT * FROM foo WHERE id = ? AND color = ?", [22, 'blue']);

我这样问是因为带编号的参数$n在动态构建查询的情况下没有帮助。

qojgxg4l

qojgxg4l1#

有一个library可用于您尝试执行的操作。操作方法如下:

var sql = require('yesql').pg

client.query(sql("SELECT * FROM foo WHERE id = :id AND color = :color")({id: 22, color: 'blue'}));
envsm3lx

envsm3lx2#

QueryConvert来拯救。它将接受一个参数化的sql字符串和一个对象,并将其转换为符合pg的查询配置。

type QueryReducerArray = [string, any[], number];
export function queryConvert(parameterizedSql: string, params: Dict<any>) {
    const [text, values] = Object.entries(params).reduce(
        ([sql, array, index], [key, value]) => [sql.replace(`:${key}`, `$${index}`), [...array, value], index + 1] as QueryReducerArray,
        [parameterizedSql, [], 1] as QueryReducerArray
    );
    return { text, values };
}

用法如下:

client.query(queryConvert("SELECT * FROM foo WHERE id = :id AND color = :color", {id: 22, color: 'blue'}));
cetgtptt

cetgtptt3#

不完全是操作员要求的。但你也可以用途:

import SQL from 'sql-template-strings';

client.query(SQL`SELECT * FROM unicorn WHERE color = ${colorName}`)

它将标记函数与模板文字结合使用来嵌入值

oyjwcjzk

oyjwcjzk4#

我一直在使用nodejs和postgres。我通常执行这样的查询:

client.query("DELETE FROM vehiculo WHERE vehiculo_id= $1", [id], function (err, result){ //Delete a record in de db
    if(err){
        client.end();//Close de data base conection
      //Error code here
    }
    else{
      client.end();
      //Some code here
    }
  });

相关问题