1

我尝试使用 Knex.JS 在我的数据库中插入数据,在某些表中我有一个外键,我猜这部分项目出现了问题。

我收到此错误消息:

error: insert into "classes" ("cost", "subject", "user_id") values ($1, $2, DEFAULT) - null value in column "user_id" violates not-null constraint 

我的 knex 文件:

import {resolve} from 'path'

module.exports = {

  development: {
    client: 'pg',
    connection: {
      database: "XXXX",
      user: "XXXX",
       password:"XXXXXXX"

    },
    migrations: {
      directory: resolve(__dirname, 'src', 'database', 'migrations')
    }
  },
  useNullAsDefault: true
};

和我使用的迁移:

import Knex from 'knex'

export async function up(Knex: Knex) {
    return await Knex.schema.createTable('users', table => {
        table.increments('id').notNullable().primary();
        table.string('name').notNullable();
        table.string('avatar').notNullable();
        table.string('whatsapp').notNullable();
        table.string('bio').notNullable();
    })
}


export async function down(knex: Knex) {
    return await knex.schema.dropTable('users')
}
import Knex from 'knex'

export async function up(Knex: Knex) {
    return await Knex.schema.createTable('classes', table => {
        table.increments('id').notNullable().primary().unique();
        table.string('subject').notNullable();
        table.decimal('cost').notNullable();


        table.integer('user_id').
        notNullable().
        references('id').
        inTable('users').
        onDelete('CASCADE').
        onUpdate('CASCADE')
    })
}


export async function down(knex: Knex) {
    return await knex.schema.dropTable('classes')
}

我想在插入数据的那一刻可能会出现问题,因为某些数据依赖于其他数据:

async  store(req: Request, res: Response) {
        const {name,
            avatar,
            whatsapp,
            bio,
            subject,
            cost,
            schedule
            } = req.body
    
            const trx = await knex.transaction()
    
           try {
    
            var created_user = await trx('users').insert({
                name,
                avatar,
                whatsapp,
                bio
            })
    
            var user_id = created_user[0]
           
           
    
            const insertedclassesID = await trx('classes').insert({
                subject,
                cost,
                user_id
            })

我已经用 SQLite3 做到了这一点,但没有用 Postgres。例如,我必须将 ORM Knex 更改为 Sequelize?

我知道有很多问题,但我需要帮助!

谢谢你的帮助!

4

1 回答 1

0

该错误告诉您不能在“类”表中为“用户”插入空值。

您可以根据所需的功能解决此问题。

如果 classes 表中的 users 列可能为 null,则更改您的迁移:

table.integer('user_id').
    defaultTo(null).
    references('id').
    inTable('users').
    onDelete('CASCADE').
    onUpdate('CASCADE')

否则,如果用户列应始终包含数据,则检查您的用户 ID 是否分配正确

var user_id = created_user[0]

我认为该行应替换为:

var user_id = created_user[0].id

但不能说不运行它。

于 2021-11-19T21:12:32.997 回答