knexjs 为什么 mysql 不 return 在插入后立即正确选择记录
knexjs why mysql doesn't return correct records on selects immediately after insert
我在 MySQL 中按 knexjs
插入记录,但在 select 之后立即 returns 旧记录。为什么?当我将 timeout() 设置为在插入和 select 函数之间延迟时,返回了正确的记录!
function(cb) { //callUser plan
sd = moment(new Date()).format("YYYY-MM-DD HH:mm:ss");
ed = moment(new Date()).add(31, 'days').format("YYYY-MM-DD HH:mm:ss");
space = planDetail.space * 1024 * 1024 * 1024;
knex('user_plan')
.insert({
'username': userDetail.username,
'plan_id': planDetail.id,
'created': knex.raw('NOW()'),
'start_date': sd,
'end_date': ed,
'transaction_id': tran.id,
'space': space,
'slot': planDetail.slot
})
.asCallback(cb);
},
function(res, cb) {
logger.log(res);
return cb(null);
},
function(cb) {
knex.select('*').from('user_plan').where({
username: self.username,
})
.andWhere('start_date', '<', knex.raw('NOW()'))
.andWhere('end_date', '>', knex.raw('NOW()'))
.orderBy('id', 'desc')
.asCallback(function(err, rows) {
if(err) return cb(err);
logger.log(rows);
});
},
你有远程连接到你的数据库吗?
在那种情况下,您的客户端时钟和服务器时钟可能有点不同。从代码中我可以看到您正在使用 moment()
在客户端创建插入的 sd
和 ed
,然后将所选行与数据库服务器时间 NOW()
.
您也可以通过获取所有行或只获取最后插入的行(不比较日期)来调试它,并看到刚刚插入的行实际上是在插入后直接从数据库中找到的。
我在 MySQL 中按 knexjs
插入记录,但在 select 之后立即 returns 旧记录。为什么?当我将 timeout() 设置为在插入和 select 函数之间延迟时,返回了正确的记录!
function(cb) { //callUser plan
sd = moment(new Date()).format("YYYY-MM-DD HH:mm:ss");
ed = moment(new Date()).add(31, 'days').format("YYYY-MM-DD HH:mm:ss");
space = planDetail.space * 1024 * 1024 * 1024;
knex('user_plan')
.insert({
'username': userDetail.username,
'plan_id': planDetail.id,
'created': knex.raw('NOW()'),
'start_date': sd,
'end_date': ed,
'transaction_id': tran.id,
'space': space,
'slot': planDetail.slot
})
.asCallback(cb);
},
function(res, cb) {
logger.log(res);
return cb(null);
},
function(cb) {
knex.select('*').from('user_plan').where({
username: self.username,
})
.andWhere('start_date', '<', knex.raw('NOW()'))
.andWhere('end_date', '>', knex.raw('NOW()'))
.orderBy('id', 'desc')
.asCallback(function(err, rows) {
if(err) return cb(err);
logger.log(rows);
});
},
你有远程连接到你的数据库吗?
在那种情况下,您的客户端时钟和服务器时钟可能有点不同。从代码中我可以看到您正在使用 moment()
在客户端创建插入的 sd
和 ed
,然后将所选行与数据库服务器时间 NOW()
.
您也可以通过获取所有行或只获取最后插入的行(不比较日期)来调试它,并看到刚刚插入的行实际上是在插入后直接从数据库中找到的。