Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在nodejs pg模块中创建动态查询功能?_Node.js_Postgresql_Node Pg Pool - Fatal编程技术网

Node.js 如何在nodejs pg模块中创建动态查询功能?

Node.js 如何在nodejs pg模块中创建动态查询功能?,node.js,postgresql,node-pg-pool,Node.js,Postgresql,Node Pg Pool,例如: const update=({title,price,imageUrl,description,whereId,whereTitle})=>{ 返回db.query( `更新产品 SET title=$1, 价格=$2, “imageUrl”=$3, description=$4 哪里 id=$5, 标题类似“%$6%” `, [标题、价格、图像URL、说明、whereId、whereTitle], ) } 更新({ 其中ID:1, 标题:《外星人2:电布加勒》, 描述:“有史以来最好的

例如:

const update=({title,price,imageUrl,description,whereId,whereTitle})=>{
返回db.query(
`更新产品
SET title=$1,
价格=$2,
“imageUrl”=$3,
description=$4
哪里
id=$5,
标题类似“%$6%”
`,
[标题、价格、图像URL、说明、whereId、whereTitle],
)
}
更新({
其中ID:1,
标题:《外星人2:电布加勒》,
描述:“有史以来最好的续集”,
})
//应执行此查询:
//更新产品集标题='外星人2:Electric Boogaloo',描述'Best sequel ever',其中id=1
//并保持价格“imageUrl”不变/以前的值
更新({
书名:'教父',
价格:20,,
})
//应执行此查询:
//更新产品设置价格=20,其中标题类似于“%goddaver%”
//或者将每种含有“教父”字样的产品的价格定为20美元
//并保持标题“imageUrl”、描述、id不变/以前的值
现在,我必须为每个可能的查询创建一个查询

  • 设置id所在的标题

  • 设置标题、价格,其中id

  • 设置价格,“imageUrl”中的标题

这不是很干燥,所以我认为一定有更好的方法

编辑1:

这就是我想象的代码的样子

db.query(
`更新产品
设置
title!==null?“title=$1,”:skipToNextLine()
price!==null?“price=$2,”:skipToNextLine()
“imageUrl”!==null?”\“imageUrl\”=$3,”:skipToNextLine()
description!==null?“description=$4”:skipToNextLine()
whereId!==null&&whereTitle!==null?“WHERE”:skipToNextLine()
whereId!==null?“id=$5,”:skipToNextLine()
whereTitle!==null?“title类似“%$6%”:skipToNextLine()
`,
[标题、价格、图像URL、说明、whereId、whereTitle],
)
我用三元表达的方式来表达,但还有很多其他的风格。我认为这个想法类似于html的模板语言,如pug.js、ejs、handlebar等。除了为html编写几十个静态html文件之外,肯定还有其他方法

编辑2:

我使用字符串连接来实现快速而肮脏的解决方案,但我想知道它是否容易受到SQL注入的攻击。代码也变得很长,代码的可靠性/易理解性显著下降

以下是我当前的解决方案:

const更新=({
标题
价格,
imageUrl,
描述
何处,
其中标题:,
}) => {
让queryText='更新产品集'
让queryValue=[]
让DollaCounter=1
如果(!!标题){
queryText=queryText.concat(`title=${dollarCounter},`)
queryValue.push(标题)
多拉计数器++
}
如果(!!价格){
queryText=queryText.concat(`price=${dollarCounter},`)
查询值推送(价格)
多拉计数器++
}
如果(!!图像URL){
queryText=queryText.concat(`imageUrl=${dollarCounter},`)
queryValue.push(imageUrl)
多拉计数器++
}
如果(!!说明){
queryText=queryText.concat(`description=${dollarCounter},`)
queryValue.push(说明)
多拉计数器++
}
queryText=queryText.slice(0,-1)
if(!!whereId | |!!whereTitle)queryText=queryText.concat('WHERE')
如果(!!whereId){
queryText=queryText.concat(`id=${dollarCounter},`)
queryValue.push(whereId)
多拉计数器++
}
如果(!!whereTitle){
queryText=queryText.concat(`title ILIKE'$${dollarCounter}%',`)
queryValue.push(whereTitle)
多拉计数器++
}
queryText=queryText.slice(0,-1)
常量查询={
名称:“更新”,
文本:queryText,
值:queryValue,
}
返回db.query(查询)
}

如果您对ORM解决方案感兴趣,尝试使用它将很容易做到这一点,但为此创建的任何功能都会过于特定于您的特定查询,无法在其他地方使用。例如,您可以编写什么样的逻辑来确定“whereTitle”需要一个
ilike
,而“whereId”需要
=
?如果不针对您的特定用例进行硬编码,就没有任何数据可以做出决定。如果您关心DRY,您应该重新构造数据,以便该代码可以实际用于其他地方,这意味着这应该能够基于其他一些(目前不存在)来确定属性。@Vanojx1我被建议不要使用sequelize,因为:-我对postgresql的语法很熟悉-我听说使用orm很难/不可能进行复杂的查询-我听说orm的性能不如vanilapg@404我添加了我想象中的伪代码。基本上,它就像一种html模板语言,您可以在其中生成一个动态html文件,但必须有一种方法通过psql查询来实现这一点。这就像三元表达式:如果为真,则添加此行,否则转到下一行