Node/Express 中的 Sequelize - “没有这样的表:main.User` 错误

问题描述 投票:0回答:3

我正在尝试使用 Sequelize 构建一个简单的 Node/Express 应用程序,但是当我尝试在关系数据库中创建新记录时,我收到错误

Unhandled rejection SequelizeDatabaseError: SQLITE_ERROR: no such table: main.User
。基本上,我在
Users
表中创建一个用户,然后尝试在
Addresses
表中创建相关地址 - 用户已成功创建,但在创建地址时失败并出现此错误...它在哪里获取表名中的
main
前缀? (下面有完整的错误读数)...

首先,这是我的程序的概要...

  • 我的 Sequelize 版本是

    Sequelize [Node: 6.8.1, CLI: 2.4.0, ORM: 3.29.0]
    ,我使用 Sequelize CLI 命令
    sequelize init
    来设置我的项目的这一部分。

  • 我正在使用 SQLite3 进行本地开发,并且在

    config/config.json
    中我将开发数据库定义为

    "development": {
        "storage": "dev.sqlite",
        "dialect": "sqlite"
    }
    
  • 我的用户迁移:

    'use strict';
        module.exports = {
            up: function(queryInterface, Sequelize) {
                return queryInterface.createTable('Users', {
                    id: {
                        allowNull: false,
                        autoIncrement: true,
                        primaryKey: true,
                        type: Sequelize.INTEGER
                    },
                    first_name: {
                        type: Sequelize.STRING
                    },
                    last_name: {
                        type: Sequelize.STRING
                    },
                    createdAt: {
                        allowNull: false,
                        type: Sequelize.DATE
                    },
                    updatedAt: {
                        allowNull: false,
                        type: Sequelize.DATE
                    }
                });
            },
            down: function(queryInterface, Sequelize) {
                return queryInterface.dropTable('Users');
            }
        };
    
  • 以及地址迁移(略):

    module.exports = {
        up: function(queryInterface, Sequelize) {
            return queryInterface.createTable('Addresses', {
                id: {
                    allowNull: false,
                    autoIncrement: true,
                    primaryKey: true,
                    type: Sequelize.INTEGER
                },
                address_line_one: {
                    type: Sequelize.STRING
                },
                UserId: {
                    type: Sequelize.INTEGER,
                    allowNull: false,
                    references: {
                        model: "User",
                        key: "id"
                    }
                }
            })
        }
    
  • 用户模型:

    'use strict';
    module.exports = function(sequelize, DataTypes) {
        var User = sequelize.define('User', {
            first_name: DataTypes.STRING,
            last_name: DataTypes.STRING
        }, {
       classMethods: {
           associate: function(models) {
               models.User.hasOne(models.Address);
           }
        }
     });
    return User;
    };
    
  • 和地址模型:

    'use strict';
    module.exports = function(sequelize, DataTypes) {
        var Address = sequelize.define('Address', {
            address_line_one: DataTypes.STRING,
            UserId: DataTypes.INTEGER
        }, {
            classMethods: {
                associate: function(models) {
                    models.Address.hasOne(models.Geometry);
                    models.Address.belongsTo(models.User, {
                        onDelete: "CASCADE",
                        foreignKey: {
                            allowNull: false
                        }
                    });
                }
              }
          });
     return Address;
     };
    
  • 最后是我的路线

    index.js
    :

    router.post('/createUser', function(req, res){
        var firstName = req.body.first_name;
        var lastName = req.body.last_name;
        var addressLineOne = req.body.address_line_one;
    
        models.User.create({
            'first_name': newUser.firstName,
            'last_name': newUser.lastName
        }).then(function(user){         
            return user.createAddress({
                'address_line_one': newUser.addressLineOne
        })
    })
    

因此,当我尝试发布到

/createUser
时,用户将成功创建,控制台会显示已创建新地址 (
INSERT INTO 'Addresses'...
),但地址未创建,并记录以下错误:

Unhandled rejection SequelizeDatabaseError: SQLITE_ERROR: no such table: main.User
    at Query.formatError (/Users/darrenklein/Desktop/Darren/NYCDA/WDI/projects/world_table/wt_test_app_1/node_modules/sequelize/lib/dialects/sqlite/query.js:348:14)
    at afterExecute (/Users/darrenklein/Desktop/Darren/NYCDA/WDI/projects/world_table/wt_test_app_1/node_modules/sequelize/lib/dialects/sqlite/query.js:112:29)
    at Statement.errBack (/Users/darrenklein/Desktop/Darren/NYCDA/WDI/projects/world_table/wt_test_app_1/node_modules/sqlite3/lib/sqlite3.js:16:21)

几个月前我用 Sequelize 做过一次这样的事情,而且很成功,我一辈子都无法弄清楚我在这里错过了什么。为什么应用程序要寻找

main.User
,以及如何让它寻找正确的表格?谢谢!

node.js express sqlite sequelize.js sequelize-cli
3个回答
13
投票

啊哈!一个小错误使我的整个行动脱轨。在迁移文件中,

references.model
必须是复数!

references: {
    model: "Users",
    key: "id"
}

繁荣。


1
投票

同样的事情也发生在我身上。

在我的开发和生产数据库中,我使用MySQL;似乎对于 MySQL,您可以使用

references.model
references.id
模型的名称和模型中的字段。

在本地我开始使用SQLite进行测试,但不起作用。它要求您指定与引用表中完全相同的表名称和字段。


0
投票

对我来说,当我将“表名称”分配给该模型时,而不是在我的实际模型/类中定义的内容,它就起作用了。

所以我有这个:

      inAppNotificationId: {
        allowNull: false,
        type: DataTypes.UUID,
        references: {
          model: 'InAppNotifications',
          key: 'id',
        },
        onUpdate: 'CASCADE',
        onDelete: 'CASCADE',
      }

将其更改为表的名称,并且成功了。

      inAppNotificationId: {
        allowNull: false,
        type: DataTypes.UUID,
        references: {
          model: 'in_app_notifications',
          key: 'id',
        },
        onUpdate: 'CASCADE',
        onDelete: 'CASCADE',
      }

我认为这也可能是问题中的问题,因为他们的桌子也称为

Users
,并更改为该值,修复了它。 可能与“复数/单数”无关。

© www.soinside.com 2019 - 2024. All rights reserved.