Knex.js执行seed:run触发弃用警告:调用knex未指定tableName
解决Knex.js seed运行时的弃用警告问题
我之前也碰到过这个一模一样的警告,其实根源就是Knex的新版本对**不指定表名直接调用knex()**的写法做了弃用处理,咱们一步步排查解决:
1. 先检查你的Seed文件写法
这个警告90%的情况都是因为在seed里直接用了空的knex()调用,比如旧写法里会先调用knex()再用.into('tableName')来指定表,现在这种写法已经被弃用了。
举个错误写法的例子:
exports.seed = function(knex) { // 这里调用空的knex()会触发警告 return knex() .del() .into('users') .then(() => { // 这里同样是空调用knex() return knex() .insert([{name: 'Tom'}, {name: 'Jerry'}]) .into('users'); }); };
正确的写法应该是一开始就指定表名,把knex()改成knex('tableName'):
exports.seed = function(knex) { // 直接指定users表 return knex('users') .del() .then(() => { // 同样先指定表名再插入 return knex('users') .insert([{name: 'Tom'}, {name: 'Jerry'}]); }); };
2. 复杂查询的处理(无直接表关联的情况)
如果你的seed里有一些更复杂的查询,比如不需要直接绑定某个表的操作,那就要用knex.queryBuilder()来代替原来的空knex()调用。
比如旧写法:
// 空knex()调用触发警告 const subquery = knex().select('id').from('roles').where('name', 'admin');
改成:
// 用queryBuilder替代空knex() const subquery = knex.queryBuilder().select('id').from('roles').where('name', 'admin');
不过其实这种场景下,更推荐直接写成knex('roles').select('id').where('name', 'admin'),代码更简洁也符合新版本规范。
3. 特殊情况:Raw查询不受影响
如果你在seed里用了knex.raw()执行原生SQL,那完全不用担心,这种写法不会触发这个弃用警告,只有空的knex()调用才会有问题。
按照这个思路检查你的seed文件,替换掉所有空的knex()调用,应该就能彻底消除这个警告了。
内容的提问来源于stack exchange,提问作者Ali Hesari
相关产品推荐
相关产品推荐

