我正在尝试使用 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
,以及如何让它寻找正确的表格?谢谢!
啊哈!一个小错误使我的整个行动脱轨。在迁移文件中,
references.model
必须是复数!
references: {
model: "Users",
key: "id"
}
繁荣。
同样的事情也发生在我身上。
在我的开发和生产数据库中,我使用MySQL;似乎对于 MySQL,您可以使用
references.model
和 references.id
模型的名称和模型中的字段。
在本地我开始使用SQLite进行测试,但不起作用。它要求您指定与引用表中完全相同的表名称和字段。
对我来说,当我将“表名称”分配给该模型时,而不是在我的实际模型/类中定义的内容,它就起作用了。
所以我有这个:
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
,并更改为该值,修复了它。 可能与“复数/单数”无关。