2014-07-03 49 views
3

我試圖用使用MySQL的函數「NOW()」中的INSERT語句node-mysql module使用node-mysql,我該如何逃避mysql函數?

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()函數?

+1

'date_joined'的可能值是多少?爲什麼你在這裏使用佔位符,如果它不是一個常量值,而是一個函數調用? – zerkms

+0

date_joined是'datetime'類型。我不需要爲我猜測的函數使用佔位符,但這會使它更具可讀性。 – adamdport

+0

更可讀(可爭論)和破壞:-D所以 - 它可以實際上是一個字符串文字在這裏或總是'now()'?如果是這樣 - 爲什麼不把它作爲一個查詢? – zerkms

回答

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 
+0

[在我的問題後增加了3.5年](https://github.com/mysqljs/mysql/blob/master/Changes.md#v2150-2017-10-05),但看起來正是我當時所需要的。感謝necromancing這篇文章! – adamdport

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){ ... });