INSERT INTO 因 node-mysql 失败 - 变量始终为 NULL
Posted
技术标签:
【中文标题】INSERT INTO 因 node-mysql 失败 - 变量始终为 NULL【英文标题】:INSERT INTO fails with node-mysql - variable is always NULL 【发布时间】:2016-01-19 15:47:37 【问题描述】:我正在将 mysql 与 node.js 一起使用
我有这个查询,但它不起作用,MySQL 中的 temp1 始终为 NULL:
var queryTemp1 = tid: '1', temp: temp1, timestamp: myDate ;
con.query('INSERT INTO temps SET ?', queryTemp1, function(err,res)
if(err) throw err;
console.log('Last insert ID:', res.insertId);
);
我认为 temp1 是浮动的--我可以打印它并且一切正常:
var temp1 = parseFloat(stdout);
var temp1 = temp1/1000
var temp1 = (temp1.toFixed(2));
我的表有列:
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| tid | smallint(6) | YES | | NULL | |
| timestamp | datetime | YES | | NULL | |
| temp | float(4,2) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
我做错了什么?
【问题讨论】:
你不能只是set 1
。设置 WHICH 字段?
NULL 在临时字段中
那么你需要set temp=?
。你不能只设置一个值。值已经“设置”了。
【参考方案1】:
tid
当前是一个字符串,它正在寻找一个tinyint
,尝试去掉单引号,看看是否会触发。
还要确保您的日期时间是一个日期时间而不是实际上的时间戳,例如 2014-01-01 00:00:00
而不是 1231232131
编辑:您的代码可能正在清除值,
var temp1 = parseFloat(stdout);
var temp1 = temp1/1000
var temp1 = (temp1.toFixed(2));
如果您需要更新 temp1,请取出 var
。
var temp1 = parseFloat(stdout);
temp1 = temp1/1000
temp1 = (temp1.toFixed(2));
【讨论】:
我试过不加引号,没有任何变化。时间戳确实是日期时间 - 它工作得很好,并将日期存储在 MySQL 中 您能否检查一下 tid 是否实际上也不是主键。 此表中没有主键。 我改变了,但没有帮助 你能给我们举个例子temp1
echo/console.log()吗?【参考方案2】:
那个 INSERT 语句看起来不对...
试试这个:
// BIND PARAMS
var queryTemp1 = tid: '1'
, temp: temp1
, timestamp: myDate
;
// VARIABLE FOR SQL
var sql = "INSERT INTO temps(tid, temp, timestamp)\
VALUES (:tid, :temp, :timestamp)";
// DATABASE
con.query( sql
, queryTemp1
, function(err, res)
if(err) throw err;
console.log('Last insert ID:', res.insertId);
);
【讨论】:
我想插入所有值,并且提供的分辨率就像只想插入温度一样。 查看 MySQL 文档 - 看起来您确实可以使用INSERT SET
dev.mysql.com/doc/refman/5.6/en/insert.html 。我从来没用过!无论如何 - 我不确定它是否适合绑定变量。看看我的回答是否对您有帮助,如果您需要更多帮助,请随时给我留言。
结果是:var sql = "INSERT INTO temps(tid, temp, timestamp) ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ SyntaxError: Unexpected token ILLEGAL
反斜杠后可能会有一个或多个空格 - 只需检查或将其全部放在一行上 - 例如var sql = "INSERT INTO temps(tid, temp, timestamp) VALUES (:tid, :temp, :timestamp)";
我发现了,还是报错: throw err; ^ 错误:ER_PARSE_ERROR:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ':tid, :temp, :timestamp)' 附近使用正确的语法【参考方案3】:
这是完整的代码:
var mysql = require("mysql");
var child_process = require('child_process');
var temp1;
// First you need to create a connection to the db
var con = mysql.createConnection(
host: "localhost",
user: "user",
password: "password",
database: "database"
);
con.connect(function(err)
if(err)
console.log('Error connecting to Db');
return;
console.log('Connection established');
);
console.log(temp1);
child_process.exec("sudo -u www-data grep -a 't=' /var/www/temp/w1_slave | cut -f2 -d=", function (err, stdout, stderr)
if (err)
console.log("child processes failed with error code: " +
err.code);
console.log(stdout);
temp1 = parseFloat(stdout);
temp1 = temp1/1000
temp1 = (temp1.toFixed(2));
);
var moment = require('moment');
var now = moment();
myDate = moment(now.format('YYYY/MM/DD HH:mm:ss')).format("YYYY-MM-DD HH:mm:ss");
var queryTemp1 = [1, temp1];
// VARIABLE FOR SQL
var sql = "INSERT INTO temps(tid, temp) VALUES (?)";
// DATABASE
con.query(sql
, queryTemp1
, function(err, res)
if(err)console.log(queryTemp1); throw err;
console.log('Last insert ID:', res.insertId);
);
console.log(queryTemp1);
【讨论】:
用 SET 替换 VALUES - 如果你想使用 VALUES,那么你需要规定它们是什么(如我的回答所示)【参考方案4】:我的用例的一个工作示例,它插入一行并返回 insertId
:
函数定义:
const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));
const insertLog = async (db, requestUrl, requestType, isRequestSuccessful) =>
let insertId = null;
const stmt = 'insert into logs(request_url, request_type, request_status) values (?, ?, ?)';
const insertData = [requestUrl, requestType, isRequestSuccessful ? 'successful' : 'failed'];
db.query(stmt, insertData, (err, result, fields) =>
if (err)
throw err;
insertId = result.insertId;
);
while(insertId === null)
await sleep(100);
return insertId;
;
用法:
const logId = await insertLog(mysqlConnection, browseUrl, 'browse', false);
我正在使用 mysql 包 v2.18.1 和节点 v15.4.0。
应该很容易适应您的用例,例如
const insertId = await insert(mysqlConnection, data);
【讨论】:
以上是关于INSERT INTO 因 node-mysql 失败 - 变量始终为 NULL的主要内容,如果未能解决你的问题,请参考以下文章