【问题标题】:`knex.js` violates foreign key constraint when seeding`knex.js` 在播种时违反了外键约束
【发布时间】:2019-07-01 22:29:13
【问题描述】:

两个种子文件

const faker = require('faker')

exports.seed = (knex, Promise) => {
  // Deletes ALL existing entries
  return knex('posts')
    .truncate()
    .del()
    .then(() => {
      // Inserts seed entries
      return knex('posts').insert([
        {
          id: 1,
          title: faker.lorem.words(),
          body: '12 - 10',
          answers: '[12]',
          user_id: 1
        },
        {
          id: 2,
          title: faker.lorem.words(),
          body: '12 - 10 + 123',
          answers: '[12]',
          user_id: 1
        },
        {
          id: 3,
          title: faker.lorem.words(),
          body: '12 - 10 / 901',
          answers: '[12]',
          user_id: 1
        }
      ])
    })
}



exports.seed = function(knex, Promise) {
  // Deletes ALL existing entries
  return knex('users')
    .truncate()
    .del()
    .then(function() {
      // Inserts seed entries
      return knex('users').insert([
        { id: 1, email: 'george@stoplion', username: 'stoplion' },
        { id: 2, email: 'angelmcfood@gmail.com', username: 'testuser1' }
      ])
    })
}

Posts 有一个 user_id 外键引用 User.id

我想在每次测试之前截断所有数据和种子。但收到此错误:

 Error while executing "/Users/me/Code/TallyCat-App/next-

tally/db/seeds/1_users.js" 
seed: delete from "users" - update or delete on table "users" violates 
foreign key constraint "posts_user_id_foreign" on table "posts"

【问题讨论】:

  • 我认为这与种子运行的顺序有关,您应该先运行users 种子,因为posts 有一个指向user_id 的外键。如果您发布这些表的迁移文件会有所帮助。

标签: knex.js


【解决方案1】:

这些种子的编写方式是它们都只能运行以清理数据库,其中有空的 usersposts 表。

当 DB 为空时会发生以下情况:

  1. 1_users.js 向用户表写入 2 行
  2. 2_posts.js 写入 3 行,其中包含引用用户的键

一切顺利

当表中有数据时会发生这种情况:

  1. 1_users.js 尝试清空用户表
  2. 1_users.js 脚本失败,因为存在引用 users 表的键

您应该以将所有相关数据添加到单个迁移文件中的方式编写种子脚本,该文件首先截断两个表,然后重新填充两个表。

无法根据表格拆分人口数据

【讨论】:

    猜你喜欢
    • 2014-10-24
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    相关资源
    最近更新 更多