Knex迁移链式建表报错:字段类型undefined不存在问题求助
解决Knex迁移中字段类型
undefined的问题 你遇到的这个错误根源非常直接——Knex的Schema构建器里并没有table.int()这个方法,你误用了缩写写法,导致Knex无法识别字段类型,最终生成了类型为undefined的字段,触发了数据库报错。
问题细节分析
在你的posts和comments表定义中,你写了table.int('userId')和table.int('postId'),但Knex官方提供的用于定义整数类型字段的正确方法是table.integer()。这个拼写错误让Knex无法解析字段类型,才会在SQL语句里出现"userId" undefined not null这种异常内容。
另外还有一个容易忽略的隐藏问题:你的down函数删除表的顺序不正确。因为posts和comments表都通过外键依赖users表,直接先删除users会触发外键约束冲突,正确的删除顺序应该是先删依赖表,再删被依赖的表。
修正后的完整迁移代码
exports.up = function(knex) { return knex.schema.createTable('users', function(table){ table.increments(); table.string('email', 100).unique().notNullable(); table.string('password').notNullable(); }) .createTable('posts', function(table){ table.increments(); table.string('title').notNullable(); table.string('content').notNullable(); table.timestamp('created_at').defaultTo(knex.fn.now()); // 将错误的int()替换为正确的integer() table.integer('userId').notNullable().references('id').inTable('users'); }) .createTable('comments', function(table){ table.increments(); table.string('content').notNullable(); table.timestamp('created_at').defaultTo(knex.fn.now()); // 同样替换int()为integer() table.integer('userId').notNullable().references('id').inTable('users'); table.integer('postId').notNullable().references('id').inTable('posts'); }) }; exports.down = function(knex) { // 调整删除顺序:先删最底层的comments,再删posts,最后删users return knex.schema.dropTable('comments') .dropTable('posts') .dropTable('users'); };
额外注意事项
- Knex的字段类型方法均为完整拼写,比如
integer、string、timestamp,不存在缩写形式,使用时可以对照官方文档确认方法名。 - 涉及外键关联的表,创建顺序必须保证被依赖的表(如
users)先创建;删除顺序则完全相反,避免外键约束导致的操作失败。
内容的提问来源于stack exchange,提问作者Sprawl63
相关产品推荐
相关产品推荐

