Mysql 在Nodejs中编写原始sql查询是一种好的做法吗?
原始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。但是,如果应用程序需要一个或两个查询,
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)}`