首页 > 解决方案 > 我正在尝试为数据库播种,但 Sequelize 出现问题:无法打开引用的表“未定义”

问题描述

我在终端中收到此错误消息:SequelizeDatabaseError:无法打开引用的表“未定义”。终端消息没有指向我的任何文件,因此很难理解它的来源。

看起来问题与表之间的关系如何建立有关。

我的模型是:

用户.js

    const {DataTypes, Model} = require('sequelize');
    const sequelize = require('../config/connection');
    const Message = require('./Message');

    class User extends Model {


    }

    User.init(
        {
            user_id:{type: DataTypes.INTEGER, primaryKey:true, notNull:true,},
            username:{type: DataTypes.STRING, allowNull:false, unique:true},
            first_name:{type: DataTypes.STRING, allowNull:false},
            last_name:{type: DataTypes.STRING, allowNull:false},
            password:{type: DataTypes.STRING, allowNull:false},
        },
        {
            sequelize,
            freezeTableName: true,
            modelName: 'User',
            underscored: true,
            timestamps: false,
        },
    );

    module.exports = User;
    ``````
    Message.js
    ``````lang-js
    const {DataTypes, Model} = require('sequelize');
    const sequelize = require('../config/connection');
    const User = require('./User');
    const Comment = require('./Comment');

    class Message extends Model {
    }

    Message.init(
        {
            message_id: {
                type: DataTypes.INTEGER,
                primaryKey: true,
                notNull: true,
                autoincrement: true,
                references: {model: Comment, key: 'message_id'}
            },
            content: {type: DataTypes.STRING},
            username: {type: DataTypes.STRING, allowNull:false, references:         {model: User, key: 'user_id'}},
        },
        {
            sequelize,
            freezeTableName: true,
            modelName: 'Message',
            timestamps: false,
            underscored: true,
        }
    );

    module.exports = Message;
    ``````


What am I doing wrong?

标签: node.jssequelize.js

解决方案


我删除了模型中的所有引用,还允许 Sequelize 自行创建外键字段。

这些变化带来了诀窍:

const {DataTypes, Model} = require('sequelize');
const sequelize = require('../config/connection');

class Message extends Model {
}

Message.init(
    {
        id: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            primaryKey: true,
            allowNull: false,
        },
        title: {type: DataTypes.STRING},
        content: {type: DataTypes.STRING},
        //user_id: {type: DataTypes.INTEGER, allowNull: false},
        // user_id: {type: DataTypes.INTEGER, allowNull: false, references: {model: sequelize.models.User, key:"user_id"}},
    },
    {
        sequelize,
        modelName: 'Message',
        freezeTableName: true,
        underscored: true,
        timestamps: true,
    }
);

module.exports = Message;

模型/index.js :

const Sequelize = require('sequelize');
const User = require('./User')
const Message = require('./Message')
const Comment = require('./Comment')


User.hasMany(Message, {foreignKey: {name: 'user_id', allowNull: false,}});
Message.belongsTo(User);

Message.hasMany(Comment, {foreignKey: {name: 'message_id', allowNull: false,}});
Comment.belongsTo(Message);

User.hasMany(Comment, {foreignKey: {name: 'user_id', allowNull: false,}});
Comment.belongsTo(User);

module.exports = {User, Message, Comment}

推荐阅读