Nodejs 操作 mysql 能插入记录,但是查询不到结果,求解

Nodejs 操作 mysql 能插入记录,但是查询不到结果,求解

db.js 代码:

console.log("开始连接mysql......");
var conn = require("mysql").createClient({
    'host':'localhost',
    'port':'3306',
    'user':'root',
    'password':''
});

ClientConnectionReady = function(client){
client.query('USE nodejs',function(error,results){
    if(error){
        console.log("数据库连接错误:" + error.message);
        client.end();
        return;
    }
    console.log("已经建立到数据库:nodejs的连接");

    //插入一条测试数据
    var sql = "INSERT INTO test SET id=?, user_name=?, nick_name=?",
        values = [ , "jim", "jimmy"];
    client.query(sql, values, function(error, results){
        if(error) {
            console.log("插入记录出错: " + error.message);
            client.end();
            return;
        }
        console.log('Inserted: ' + results.affectedRows + ' row.');
        console.log('Id inserted: ' + results.insertId);
    });

    getData(client);
});
}

getData = function(client){
var sql = "select * from test";
client.query(sql, function selectCb(error, results, fields){
    if(error){
        console.log('查询出错:'+error.message);
        client.end();
        return;
    }
    console.log("查询表:test");
    //console.log(fields);
    console.log('查到结果:' + results.length + "条");
    if(results.length > 0){ //查看第一条记录
        var firstResult=results[0];
        console.log('id:' + firstResult['id']);
        console.log('user_name:' + firstResult['user_name']);
        console.log('nick_name:' + firstResult['nick_name']);

    }
});
client.end();
console.log("关闭数据库连接");
}

ClientConnectionReady(conn);

11 回复

根据你提供的代码,你的问题可能在于 client.end() 的位置。client.end() 方法会关闭数据库连接,而你在查询数据之前就调用了它,这会导致查询无法完成。你需要将 client.end() 放在所有操作完成之后再调用。

以下是修改后的代码:

console.log("开始连接mysql......");
var mysql = require("mysql");

// 创建数据库连接
var conn = mysql.createClient({
    host: 'localhost',
    port: '3306',
    user: 'root',
    password: ''
});

ClientConnectionReady = function (client) {
    client.query('USE nodejs', function (error, results) {
        if (error) {
            console.log("数据库连接错误:" + error.message);
            client.end();
            return;
        }
        console.log("已经建立到数据库:nodejs的连接");

        // 插入一条测试数据
        var sql = "INSERT INTO test SET id=?, user_name=?, nick_name=?",
            values = [null, "jim", "jimmy"];
        client.query(sql, values, function (error, results) {
            if (error) {
                console.log("插入记录出错: " + error.message);
                client.end();
                return;
            }
            console.log('Inserted: ' + results.affectedRows + ' row.');
            console.log('Id inserted: ' + results.insertId);

            // 查询数据
            getData(client);
        });
    });
}

getData = function (client) {
    var sql = "SELECT * FROM test";
    client.query(sql, function selectCb(error, results, fields) {
        if (error) {
            console.log('查询出错:' + error.message);
            client.end();
            return;
        }
        console.log("查询表:test");
        console.log('查到结果:' + results.length + "条");
        if (results.length > 0) { // 查看第一条记录
            var firstResult = results[0];
            console.log('id:' + firstResult['id']);
            console.log('user_name:' + firstResult['user_name']);
            console.log('nick_name:' + firstResult['nick_name']);
        }

        // 关闭数据库连接
        client.end();
        console.log("关闭数据库连接");
    });
}

ClientConnectionReady(conn);

修改点:

  1. client.end() 的位置:在查询数据之后调用 client.end()
  2. 插入语句中的 id:使用 null 作为 id 的值,让 MySQL 自动生成 id
  3. 其他格式调整:为了提高代码可读性,做了些小调整。

通过这些修改,你应该能够成功插入记录并查询到结果。希望这能解决你的问题!


运行: 运行结果

  • 你这个代码写的不太规范啊,getData加var
  • 数据库里有数据了嘛?getData(client);放到client.query的回调里试试

数据库里本来有5条我手动添加的数据 去掉getData 把查询操作放在 client.query 的回调里也试过 查询操作还是放在插入操作的后面执行的 仍旧查询不到记录 update操作也是正常的 就查询出问题 郁闷

client.end();

console.log(“关闭数据库连接”);

这个最好放在 query 的回调里面吧,因为是异步的

嗯 谢谢提醒。 问题又来了,今天回到公司我重装了 mysql 模块 , 硬是出现之前的问题 查询不出结果 ,增删改操作都可以。然后我在虚拟机ubuntu里 同样的代码和我在家里机器上win7都能查出结果, 出问题的机器是xp的 难道和操作系统有关系??

难道那个查询的方法调用不需要放到插入的回调函数里面吗? getData(client); 这样也无法保证你里面插入进去,就能查询出来了。

这里如果要想查询出的数据包含之前插入的数据 ,只需将查询操作放在插入操作后面就可以。

郁闷死,我也碰到这个问题,怎么也查询不到数据。

从提供的代码来看,问题可能出现在以下几个方面:

  1. 事务管理:如果你在一个事务中插入了数据,但没有提交事务,那么插入的数据将不会立即可见。
  2. 查询时机:在插入数据后立即查询数据,有可能因为事务或者缓存的原因导致查询不到数据。建议在插入数据后等待一段时间再进行查询,或者在插入数据成功后再进行查询。

示例代码修正

console.log("开始连接mysql......");
var mysql = require('mysql');
var conn = mysql.createConnection({
    host: 'localhost',
    port: '3306',
    user: 'root',
    password: ''
});

conn.connect(function(err) {
    if (err) {
        console.error('数据库连接错误: ' + err.stack);
        return;
    }
    console.log('已连接到数据库');

    conn.query('USE nodejs', function(error, results) {
        if (error) {
            console.log("使用数据库出错:" + error.message);
            conn.end();
            return;
        }
        console.log("已经选择数据库:nodejs");

        // 插入一条测试数据
        var sql = "INSERT INTO test SET id=?, user_name=?, nick_name=?",
            values = [null, "jim", "jimmy"];
        conn.query(sql, values, function(error, results) {
            if (error) {
                console.log("插入记录出错: " + error.message);
                conn.end();
                return;
            }
            console.log('Inserted: ' + results.affectedRows + ' row.');
            console.log('Id inserted: ' + results.insertId);

            // 在插入数据后等待一段时间再进行查询
            setTimeout(() => {
                getData(conn);
            }, 1000); // 等待1秒后查询
        });
    });
});

function getData(connection) {
    var sql = "SELECT * FROM test";
    connection.query(sql, function(error, results, fields) {
        if (error) {
            console.log('查询出错:' + error.message);
            connection.end();
            return;
        }
        console.log("查询表:test");
        console.log('查到结果:' + results.length + "条");
        if (results.length > 0) { // 查看第一条记录
            var firstResult = results[0];
            console.log('id:' + firstResult['id']);
            console.log('user_name:' + firstResult['user_name']);
            console.log('nick_name:' + firstResult['nick_name']);
        }
    });
}

解释

  • 事务管理:确保在插入数据后提交事务,或者在事务外进行查询。
  • 查询时机:在插入数据后等待一段时间再进行查询,以确保数据已经被正确写入并可以被查询到。

通过上述修改,应该可以解决插入数据后无法查询到结果的问题。

回到顶部