Sequelize - 外键总是空的

Sequelize - Foreign keys are always null

描述

我开始学习如何使用 Sequelize,我 运行 遇到了我的 table 之一的外键关系问题。我有三个 table:用户、项目、时间。用户和项目与时间具有多对一的关系。
Time.belongsTo(User)
Time.belongsTo(Project)
User.hasMany(Time)
Project.hasMany(Time)

在我在 Times table 中创建一个条目然后获取它之后,结果记录的两个外键始终为 Null。

db.Time.findAll().then(result => {
res.status(200).send(JSON.stringify(result))
})

型号

const {Sequelize, DataTypes} = require('sequelize');
const sequelize = new Sequelize('sqlite::memory:');

const User = sequelize.define('User', {
    email: {
        type: DataTypes.STRING,
        allowNull: false,
        unique: true
    },
    password: {
        type: DataTypes.STRING,
        allowNull: false
    }
});

const Project = sequelize.define('Project', {
    name: {
        type: DataTypes.STRING,
        allowNull: false
    }
});


const Time = sequelize.define('Time', {
    description: {
        type: DataTypes.STRING,
        allowNull: false
    },
    start: {
        type: DataTypes.STRING,
        allowNull: false
    },
    stop: {
        type: DataTypes.STRING,
        allowNull: false
    }
});

console.log('Setting up Models')

Time.belongsTo(User)
Time.belongsTo(Project)
User.hasMany(Time)
Project.hasMany(Time)

const db = {
    "sequelize": sequelize,
    "User": User,
    "Project": Project,
    "Time": Time
}

exports.User = User;
exports.Project = Project;
exports.Time = Time;
exports.db = db;

使用默认数据填充

const {data} = require('./data')
const {db} = require('../data/models')

const dbHelper = {
    connectDB: () => {
        return new Promise((resolve, reject) => {
            db.sequelize.authenticate().then(() => {
                resolve(db)
            }).catch((e) => {
                reject(e);
            })
        })
    },
    hydrateDB: (db) => {
        return new Promise((resolve, reject) => {
            try {
                db.sequelize.sync().then(() => {
                    hydrateUser(db).then(() => {
                        hydrateProject(db).then(() => {
                            hydrateTime(db).then(() => {
                                resolve()
                            })
                        })
                    })
                })
            } catch (e) {
                reject(e)
            }

        })
    }
}

const hydrateUser = (db) => {
    return new Promise(resolve => {
        data.user.forEach((datum) => {
            db.User.create(datum).then(() => {
                resolve()
            })
        })
    })
}

const hydrateProject = (db) => {
    return new Promise(resolve => {
        data.project.forEach((datum) => {
            db.Project.create(datum).then(() => {
                resolve()
            })
        })
    })
}

const hydrateTime = (db) => {
    return new Promise(resolve => {
        data.time.forEach((datum) => {
            db.Time.create({
                description: datum.description,
                start: datum.start,
                stop: datum.stop,
                userId: 1,
                projectId: 1
            }).then(() => {
                resolve()
            })
        })
    })
}

exports.dbHelper = dbHelper;

您在此处指定了驼峰式字段:

userId: 1,
projectId: 1

并且为 Time 创建的实际字段采用 pascal 大小写,如您在屏幕截图中所示。 所以只需更正名称:

db.Time.create({
                description: datum.description,
                start: datum.start,
                stop: datum.stop,
                UserId: 1,
                ProjectId: 1
            }).then(() => {
                resolve()
            })