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);
修改点:
client.end()
的位置:在查询数据之后调用client.end()
。- 插入语句中的
id
:使用null
作为id
的值,让 MySQL 自动生成id
。 - 其他格式调整:为了提高代码可读性,做了些小调整。
通过这些修改,你应该能够成功插入记录并查询到结果。希望这能解决你的问题!
运行:
- 你这个代码写的不太规范啊,getData加var
- 数据库里有数据了嘛?getData(client);放到client.query的回调里试试
数据库里本来有5条我手动添加的数据 去掉getData 把查询操作放在 client.query 的回调里也试过 查询操作还是放在插入操作的后面执行的 仍旧查询不到记录 update操作也是正常的 就查询出问题 郁闷
client.end();
console.log(“关闭数据库连接”);
这个最好放在 query 的回调里面吧,因为是异步的
嗯 谢谢提醒。 问题又来了,今天回到公司我重装了 mysql 模块 , 硬是出现之前的问题 查询不出结果 ,增删改操作都可以。然后我在虚拟机ubuntu里 同样的代码和我在家里机器上win7都能查出结果, 出问题的机器是xp的 难道和操作系统有关系??
难道那个查询的方法调用不需要放到插入的回调函数里面吗? getData(client); 这样也无法保证你里面插入进去,就能查询出来了。
这里如果要想查询出的数据包含之前插入的数据 ,只需将查询操作放在插入操作后面就可以。
从提供的代码来看,问题可能出现在以下几个方面:
- 事务管理:如果你在一个事务中插入了数据,但没有提交事务,那么插入的数据将不会立即可见。
- 查询时机:在插入数据后立即查询数据,有可能因为事务或者缓存的原因导致查询不到数据。建议在插入数据后等待一段时间再进行查询,或者在插入数据成功后再进行查询。
示例代码修正
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']);
}
});
}
解释
- 事务管理:确保在插入数据后提交事务,或者在事务外进行查询。
- 查询时机:在插入数据后等待一段时间再进行查询,以确保数据已经被正确写入并可以被查询到。
通过上述修改,应该可以解决插入数据后无法查询到结果的问题。