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 是否实际上也不是主键。 此表中没有主键。 我改变了,但没有帮助 你能给我们举个例子temp1echo/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的主要内容,如果未能解决你的问题,请参考以下文章

insert into 语句错误

易语言 insert into

insert into 插入数据问题在线等

VB insert into 的用法

sql [INSERT INTO] #Syntax #Insert_into

insert into的用法