Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.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
Mysql 在Nodejs中编写原始sql查询是一种好的做法吗?_Mysql_Node.js - Fatal编程技术网

Mysql 在Nodejs中编写原始sql查询是一种好的做法吗?

Mysql 在Nodejs中编写原始sql查询是一种好的做法吗?,mysql,node.js,Mysql,Node.js,原始sql查询,如中所示: var sql = "update node SET changed = " + params.updationTime + " where nid = " + params.nid 是否建议在.js文件中编写原始sql查询?我们倾向于SQL注入吗?或者使用Knex.js之类的库更好吗?使用ORM(对象关系映射)而不是原始查询更好,但是当查询变得复杂时,您应该使用原始查询,并注意SQL注入对于节点和mysql来说是很好的ORM。但是,如果应用程序需要一个或两个查询,

原始sql查询,如中所示:

var sql = "update node SET changed = " + params.updationTime + " where nid = " + params.nid

是否建议在.js文件中编写原始sql查询?我们倾向于SQL注入吗?或者使用Knex.js之类的库更好吗?

使用
ORM(对象关系映射)
而不是原始查询更好,但是当查询变得复杂时,您应该使用原始查询,并注意
SQL注入

对于节点和mysql来说是很好的ORM。但是,如果应用程序需要一个或两个查询,则可以转义变量。 此外,模板文本变量将比旧的字符串连接方法更干净

var sql = `update node SET changed ${params.updationTime} where nid = ${params.nid}`
根据mysql驱动程序

为了避免SQL注入攻击,您应该始终避开任何 在SQL查询中使用用户提供的数据之前。你可以这样做 使用
mysql.escape()
connection.escape()
pool.escape()


让数据库来处理和存储数据库逻辑,使用。

我喜欢在代码中使用原始参数查询,原因如下

  • 简单性:编写直接SQL查询是以原生方式与DB交互的最简单方法

  • ORM的复杂性:学习ORM基本上是在项目中增加另一层复杂性。您必须学习和掌握ORM,因为您可以在项目中完成任何专业任务。如果您从Node切换到.NET C#,则此层和知识不会转换到其他平台。原生SQL知识可以从一个平台转到另一个平台,无需任何学习

  • 当您需要编写一些定制的复杂查询时,ORM只是一个难题。并不是所有的查询都可以轻松地用ORM编写,通常您最终会在ORM上进行黑客攻击

  • ORM在已经很复杂的代码之上增加了另一层复杂性。我个人更喜欢开发软件时的简单性

  • ORM只是代码和数据库之间的另一层,许多ORM查询都会降低性能

  • 在大型项目中,ORM成为瓶颈,而不是受益。就像你不能雇佣一个有经验的开发人员,如果其中一个开发人员离开了项目。作为PM,您必须计算更换的速度,通常很难找到特定的ORM工程师。通常情况下,PM会雇佣一些他们长期培训的人。新转换的ORM开发人员也会产生错误代码或非专业代码


  • 已经说过,对原始查询使用ORM有很多好处。其中一些是以与数据库和安全性交互的方式构建的。通过参数化查询,可以在原始查询中处理安全问题

    我同意Shahzad Aslam的观点。我要补充的是,您可以在Node.js应用程序中编写简单字符串,而不仅仅是编写简单字符串。我更喜欢将查询编写为
    .sql
    文件,然后在运行时将它们解析为参数化查询(以避免sql注入)。下面是一个示例(该示例适用于Node Postgres客户端,但应与MySQL类似)


    将查询编写为实际的
    sql
    的好处是,您可以获得模块化、语法突出显示,并能够使用首选的数据库客户机/工具直接针对数据库运行查询(这对于性能分析和调试非常有用).

    像上面这样的原始查询很容易被sql注入。在这种情况下knex会更好吗?你试过Quotes吗?我刚刚遇到sequelize的问题,我喜欢“原始sql”的可见性,了解调用DB时发生了什么,调试和调整调用更容易、更快,但这也可能是由于在开发方面有一年的新经验。我的问题发生在缺乏对sequelize的es6模块的支持,以及对复杂关联不起作用的幻想破灭,以及我在尝试调试时的挫败感。我现在的计划是重新考虑我的代码并使用传统的查询,这可能需要花上几天的时间,但这将在将来节省我的时间。干杯
     var sql = `update node SET changed ${mysql.escape(params.updationTime)} where nid = ${mysql.escape(params.nid)}`