请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

外键关联时报错

model.js:

const Sequelize = require('sequelize')
const seq = require('./seq')

// seq.define:创建User模型
// 虽然这里是'user',但是实际上会创建为'users'
const User = seq.define('user', {
  // 使用Sequelize创建时,id会自动创建,并设为主键、自增
  // 同时会自动创建:createdAt 和 updatedAt
  // 这两个字段,也就是说用Sequelize修改数据,会自动记录updatedAt,新增数据时,会自动记录createdAt
  userName: {
    type: Sequelize.STRING, // varchar(255)
    allowNull: false,
    comment: "用户名"
  },
  password: {
    type: Sequelize.STRING, // varchar(255)
    allowNull: false,
    comment: "密码"
  },
  nickName: {
    type: Sequelize.STRING, // varchar(255)
    comment: "昵称"
  }
})

// 创建Blog模型
const Blog = seq.define('blog', {
  title: {
    type: Sequelize.STRING,
    allowNull: false
  },
  content: {
    type: Sequelize.STRING,
    allowNull: false
  },
  userId: {
    type: Sequelize.STRING,
    allowNull: false
  }
})

// 【报错代码】
// 【写法1】外键关联,Blog只有唯一的User
Blog.belongsTo(User, {
  // 创建外键Blog.userId => User.id
  // 也就是说Blog.userId属于User.id,即多对一的关系(一个用户有多条微博)
  foreignKey: 'userId'
})
// 【写法2】User有多个Blog
User.hasMany(Blog, {
  // 也就是说Blog.userId属于User.id,即多对一的关系(一个用户有多条微博)
  foreignKey: 'userId'
})

module.exports = {
  User,
  Blog
}

sync.js:

const seq = require('./seq')

require('./model.js')

// 测试连接
// seq.authenticate()返回的是promise,因此可以直接.then
seq.authenticate().then(() => {
  console.log('auth ok')
}).catch(() => {
  console.log('auth err')
})

// seq.sync:执行同步
// force: true表示如果数据库里面有这个表,那么就强制删除
seq.sync({ force: true }).then(() => {
  console.log('sync ok')
  // 将程序退出
  process.exit()
}).catch(() => {
  console.log('sync err')
})

seq.js:

const Sequelize = require('sequelize')

const conf = {
  host: "localhost",
  // 因为Sequelize不只可以操作mysql
  dialect:"mysql"
}
const seq = new Sequelize("koa2_weibo", "root", "root",
  conf)

module.exports = seq

老师您好,我在写belongsTo和hasMany进行外键关联,运行时会报错。并且数据库只会创建users表,而没有blogs表。
图片描述
但是把belongsTo和hasMany,去掉这两段代码,程序就可以正常执行,可以正常创建。请问这是什么原因呢?谢谢。

正在回答 回答被采纳积分+3

2回答

双越 2021-11-29 20:08:02

很奇怪呀,没有看到啥报错信息。你把这两句 sql 粘贴到 workbench 里,看是否能执行成功?

https://img1.sycdn.imooc.com//szimg/61a4c2a009d4881615600796.jpg

0 回复 有任何疑惑可以回复我~
双越 2021-11-26 18:00:47

看代码没看出哪儿的问题。

需要你自己详细调试一下,例如去掉 hasMany 只保留 belongsTo ,是否报错?

0 回复 有任何疑惑可以回复我~
  • 提问者 皮小西 #1
    是的,老师,这样也报错。去掉hasMany保留belongsTo,或者:去掉belongsTo保留hasMany。都会报错。
    回复 有任何疑惑可以回复我~ 2021-11-26 18:02:49
  • 双越 回复 提问者 皮小西 #2
    你再吧报错信息贴全了我看下,现在的图不全。
    回复 有任何疑惑可以回复我~ 2021-11-26 21:34:11
  • 提问者 皮小西 回复 双越 #3
    完整报错代码:
    C:\Users\Tools\Desktop\慕课网-nodejs\【从零模拟新浪微博】nodejs练习\sequlize-test\src>node sync.js
    Executing (default): SELECT 1+1 AS result
    Executing (default): CREATE TABLE IF NOT EXISTS `users` (`id` INTEGER NOT NULL auto_increment , `userName` VARCHAR(255) NOT NULL COMMENT '用户名', `password` VARCHAR(255) NOT NULL COMMENT '密码', `nickName` VARCHAR(255) COMMENT ' 昵称', `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
    auth ok
    Executing (default): SHOW INDEX FROM `users`
    Executing (default): CREATE TABLE IF NOT EXISTS `blogs` (`id` INTEGER NOT NULL auto_increment , `title` VARCHAR(255) NOT NULL, `content` TEXT NOT NULL, `userId` VARCHAR(255) NOT NULL, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`userId`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB;
    sync err
    回复 有任何疑惑可以回复我~ 2021-11-29 15:00:52
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信