【问题标题】:Using node-mysql, how can I NOT escape mysql functions?使用 node-mysql,我怎么能不转义 mysql 函数?
【发布时间】:2014-08-23 23:41:13
【问题描述】:

我正在尝试使用node-mysql module 在插入语句中使用 MySQL 函数“now()”:

var insert = {
  username: 'foo',
  date_joined: 'now()',
};

connection.query('INSERT INTO users SET ?', [insert],function(err, result){ ... });

正如我所料,这给了我一个错误 Error: ER_TRUNCATED_WRONG_VALUE: Incorrect datetime value: 'now()' for column 'date_joined',因为它将 now() 函数转义为字符串,而不是让 MySQL 将其解析为我想要的函数。

实际上,我的插入语句和查询要复杂得多,因此我想利用 node-mysql 提供的 escaping query values 快捷方式,而不是手动构建我的查询。

如何告诉 node-mysql 不要转义 now() 函数?

【问题讨论】:

  • date_joined 的可能值是多少?如果不是常量值而是函数调用,为什么还要在这里使用占位符?
  • date_joined 属于 datetime 类型。我不需要为我猜想的函数使用占位符,但这会使它更加更具可读性。
  • 更具可读性(可争论)和破碎的 :-D 所以 - 它实际上可以是这里的字符串文字还是总是now()?如果是这样 - 为什么不按原样将其放入查询中?
  • 我想这是一个公平的观点,尽管我确实喜欢我的所有插入数据在一个对象中清晰明了的想法,而不是分散在各处。我授予你“最后手段”的身份。
  • 我能问一下为什么这被否决了吗?如果我不清楚,我很乐意澄清。

标签: mysql node.js express node-mysql


【解决方案1】:

您可以使用mysql.raw()。这直接来自文档。

var CURRENT_TIMESTAMP = mysql.raw('CURRENT_TIMESTAMP()');
var sql = mysql.format('UPDATE posts SET modified = ? WHERE id = ?', [CURRENT_TIMESTAMP, 42]);
console.log(sql); // UPDATE posts SET modified = CURRENT_TIMESTAMP() WHERE id = 42

【讨论】:

【解决方案2】:

基本上,NOW() 的直接实现是不可能的 - see link here

上面的链接中还提到了替代解决方案/建议。

var config = require('./config');
var SqlString = require('mysql/lib/protocol/SqlString');
var mysql = require('mysql');

config.mysql.queryFormat = function(sql, values, timeZone) {
  sql = SqlString.format(sql, values, false, timeZone);
  sql = sql.replace(/'NOW\(\)'/g, 'NOW()'); 
  sql = sql.replace(/'UNIX_TIMESTAMP\(\)'/g, 'UNIX_TIMESTAMP()'); // if you want
  return sql;
};

var pool = mysql.createPool(config.mysql);

当然,对于像您的示例这样直截了当的事情,人们总是可以做到的

var data = ['foo'];

connection.query('INSERT INTO users (username) VALUES = (?, NOW())', data,function(err, result){ ... });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2011-06-22
    • 1970-01-01
    • 2012-07-20
    相关资源
    最近更新 更多