【问题标题】:Sequelize model class trying to access table name that is lower-cased "users" instead of capitalized "Users"Sequelize 模型类尝试访问小写“users”而不是大写“Users”的表名
【发布时间】:2019-10-25 15:08:24
【问题描述】:

我正在尝试使用 Sequelize model.create 函数,但一直遇到此错误:Unhandled rejection SequelizeDatabaseError: relation "users" does not existUser 类使我的表名全部小写而不是大写。我创建的表称为“用户”,但创建函数一直在尝试查找名为“用户”的表。 Executing (default): SELECT "id", "first_name", "last_name", "email", "username", "password", "dob", "created_at" AS "createdAt", "updated_at" AS "updatedAt" FROM "users" AS "User";

似乎User 类在与 postgres 通信时试图访问“用户”表。我尝试使用其他功能并一直遇到同样的问题。我的代码在下面。

/model/index.js

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../../config/db.js')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
    sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
    sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
    .readdirSync(__dirname)
    .filter(file => {
        return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
    })
    .forEach(file => {
        const model = sequelize['import'](path.join(__dirname, file));
        db[model.name] = model;
    });

Object.keys(db).forEach(modelName => {
    if (db[modelName].associate) {
        db[modelName].associate(db);
    }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

/model/users.js

'use strict';

const bcrypt = require('bcrypt');

module.exports = (sequelize, DataTypes) => {
    const User = sequelize.define('User', {
        first_name: {
            type: DataTypes.STRING,
            allowNull: false,
            unique: true
        },
        last_name: {
            type: DataTypes.STRING,
            allowNull: false
        },
        email: {
            type: DataTypes.STRING,
            allowNull: false,
            unique: true
        },
        username: {
            type: DataTypes.STRING,
            allowNull: false,
            unique: true
        },
        password: {
            type: DataTypes.STRING,
            allowNull: false
        },
        dob: {
            type: DataTypes.DATE,
            allowNull: false
        }
    }, {
        underscored: true,
        instanceMethods: {
            validPassword(password) {
                return bcrypt.compareSync(password, this.password);
            }
        }
    });

    User.beforeCreate((user) => {
        user.email = user.email.toLowerCase();
        user.first_name = user.first_name.charAt(0).toUpperCase(0) + user.first_name.slice(1);
        user.last_name = user.last_name.charAt(0).toUpperCase(0) + user.last_name.slice(1);
        return bcrypt.hash(user.password, 8).then((hash) => {
            user.password = hash;
        });
    });

    User.associate = function(models) {
        // associations can be defined here
    };
    return User;
};

/migrations/20191025125151-create-user.js

'use strict';
module.exports = {
    up: (queryInterface, Sequelize) => {
        return queryInterface.createTable('Users', {
            id: {
                allowNull: false,
                autoIncrement: true,
                primaryKey: true,
                type: Sequelize.INTEGER
            },
            first_name: {
                type: Sequelize.STRING,
                allowNull: false
            },
            last_name: {
                type: Sequelize.STRING,
                allowNull: false
            },
            email: {
                type: Sequelize.STRING,
                allowNull: false,
                unique: true
            },
            username: {
                type: Sequelize.STRING,
                allowNull: false,
                unique: true
            },
            password: {
                type: Sequelize.STRING,
                allowNull: false
            },
            dob: {
                type: Sequelize.DATE,
                allowNull: false
            },
            created_at: {
                allowNull: false,
                type: Sequelize.DATE,
                defaultValue: Sequelize.literal('NOW()')
            },
            updated_at: {
                allowNull: false,
                type: Sequelize.DATE,
                defaultValue: Sequelize.literal('NOW()')
            }
        }, {
            timestamps: true,
            underscored: true
        });
    },
    down: (queryInterface, Sequelize) => {
        return queryInterface.dropTable('Users');
    }
};

/controllers/user

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

const signup = (req, res) => {
    const { first_name, last_name, username, email, password, dob } = req.swagger.params.data.value;
    User.create({
        first_name,
        last_name,
        password,
        dob,
        username,
        email
    })
        .then((user) => {
            console.log(user);
            res.json({message: 'Success'});
        })
}

错误信息:

Executing (default): SELECT "id", "first_name", "last_name", "email", "username", "password", "dob", "created_at" AS "createdAt", "updated_at" AS "updatedAt" FROM "users" AS "User";
Unhandled rejection SequelizeDatabaseError: relation "users" does not exist
    at Query.formatError (/home/ubu/projects/stat/node_modules/sequelize/lib/dialects/postgres/query.js:366:16)
    at query.catch.err (/home/ubu/projects/stat/node_modules/sequelize/lib/dialects/postgres/query.js:72:18)
    at bound (domain.js:301:14)
    at runBound (domain.js:314:12)
    at tryCatcher (/home/ubu/projects/stat/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/home/ubu/projects/stat/node_modules/bluebird/js/release/promise.js:547:31)
    at Promise._settlePromise (/home/ubu/projects/stat/node_modules/bluebird/js/release/promise.js:604:18)
    at Promise._settlePromise0 (/home/ubu/projects/stat/node_modules/bluebird/js/release/promise.js:649:10)
    at Promise._settlePromises (/home/ubu/projects/stat/node_modules/bluebird/js/release/promise.js:725:18)
    at _drainQueueStep (/home/ubu/projects/stat/node_modules/bluebird/js/release/async.js:93:12)
    at _drainQueue (/home/ubu/projects/stat/node_modules/bluebird/js/release/async.js:86:9)
    at Async._drainQueues (/home/ubu/projects/stat/node_modules/bluebird/js/release/async.js:102:5)
    at Immediate.Async.drainQueues (/home/ubu/projects/stat/node_modules/bluebird/js/release/async.js:15:14)
    at runCallback (timers.js:794:20)
    at tryOnImmediate (timers.js:752:5)
    at processImmediate [as _immediateCallback] (timers.js:729:5)

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    您在数据库中的 createdAt 和 updatedAt 列创建表时遇到问题:

    `'use strict';
    module.exports = {
        up: (queryInterface, Sequelize) => {
            return queryInterface.createTable('Users', {
                id: {
                    allowNull: false,
                    autoIncrement: true,
                    primaryKey: true,
                    type: Sequelize.INTEGER
                },
                first_name: {
                    type: Sequelize.STRING,
                    allowNull: false
                },
                last_name: {
                    type: Sequelize.STRING,
                    allowNull: false
                },
                email: {
                    type: Sequelize.STRING,
                    allowNull: false,
                    unique: true
                },
                username: {
                    type: Sequelize.STRING,
                    allowNull: false,
                    unique: true
                },
                password: {
                    type: Sequelize.STRING,
                    allowNull: false
                },
                dob: {
                    type: Sequelize.DATE,
                    allowNull: false
                },
                createdAt: {
                    allowNull: false,
                    type: Sequelize.DATE,
                    defaultValue: Sequelize.literal('NOW()')
                },
                updatedAt: {
                    allowNull: false,
                    type: Sequelize.DATE,
                    defaultValue: Sequelize.literal('NOW()')
                }
            }, {
                timestamps: true,
                underscored: true
            });
        },
        down: (queryInterface, Sequelize) => {
            return queryInterface.dropTable('Users');
        }
    };`
    

    【讨论】:

      【解决方案2】:

      tableName 属性添加到您的define 调用中。

      ...
      underscored: true,
      tableName: 'Users',
      instanceMethods: ...

      【讨论】:

        猜你喜欢
        • 2017-06-26
        • 2020-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        • 2017-06-03
        • 2015-12-27
        • 2020-12-22
        相关资源
        最近更新 更多