外键关联时报错

来源:2-14 介绍sequelize-创建关联

皮小西

2021-11-26

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,去掉这两段代码,程序就可以正常执行,可以正常创建。请问这是什么原因呢?谢谢。

写回答

2回答

双越

2021-11-29

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

//img.mukewang.com/szimg/61a4c2a009d4881615600796.jpg

0
0

双越

2021-11-26

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

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

0
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
共3条回复

Node.js+Koa2框架生态实战 - 从零模拟新浪微博

用 Koa2 做真正的实战项目,不再只是增删改查的小白工程师

964 学习 · 388 问题

查看课程