使用node-mysql,我怎么能逃避mysql函数?

时间:2014-07-03 01:43:34

标签: mysql node.js express node-mysql

我正在尝试使用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将其解析为我想要的函数。

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:0)

基本上,无法直接实施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){ ... });