如何使用 Sequelize 和 mySql 选择外键列的名称?
How to choose name of Foreign Key column using Sequelize and mySql?
我正在使用 sequelize 在我的节点应用程序中为 mySql 数据库模式建模。我的模型的摘录如下所示:
我有一个公司-table和一个部门-table。一个公司可以有多个部门,一个部门只能属于一个公司。我将其建模如下:
公司-table:
module.exports = function(sequelize, DataTypes){
return Company = sequelize.define('Company', {
companyId: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
autoIncrement: true,
unique: true
},
name: {
type: DataTypes.STRING,
allowNull: false
}
})}
部门-table:
var Company = require('./company');
module.exports = function(sequelize,DataTypes) {
return Department = sequelize.define('Department', {
departmentId: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
autoIncrement: true,
unique: true
},
name: {
type: DataTypes.STRING,
allowNull: false
},
companyId: {
type: DataTypes.INTEGER,
references: 'Companies',
referencesKey: 'companyId',
onDelete: 'cascade'
}
});}
为了将此模式实际存储在数据库中,我使用了以下代码:
var db = require('../models/index');
db["Company"].hasMany(db["Department"], {as: 'departments'});
db["Department"].belongsTo(db["Company"], {foreignKey: 'companyId', foreignKeyConstraint: true});
models.sequelize.sync().complete(function(err){
//irrelevant for the problem
});
问题在于此代码在部门 table 中创建了 2 个外键。一个在字段"companyId"(符合预期),一个在字段"CompanyCompanyId",一个自动生成的字段。
如何确保只使用和创建我定义的外键 ('companyId')?
Sequelize 为您创建 foreignKey 字段。因此,如果您使用 belongsTo
.
,则无需在 Department
模型中定义字段 companyId
在当前情况下,它将创建两个外键,一个在模型中定义,另一个通过 belongsTo
定义,当它再次尝试创建外键时,它发现该字段已经存在,因此它创建另一个字段。
我设法解决了问题:
不应仅在 belongsTo 语句中使用 "foreignKey"-选项,还应在 "hasMany"-语句中使用它。
原问题中发布的两个模型保持不变。我唯一需要更改的是 foreignKey 选项的位置:
var db = require('../models/index');
db["Company"].hasMany(db["Department"], {as: 'departments'});
db["Department"].belongsTo(db["Company"], {foreignKey: 'companyId', foreignKeyConstraint: true});
更改为:
var db = require('../models/index');
db["Company"].hasMany(db["Department"], { foreignKey: 'companyId'});
db["Department"].belongsTo(db["Company"], {foreignKey: 'companyId'});
在4.4.0版本中,belongsTo函数有一个targetKey选项。
const User = this.sequelize.define('user', {/* attributes */})
const Company = this.sequelize.define('company', {/* attributes */});
User.belongsTo(Company, {foreignKey: 'fk_companyname', targetKey: 'name'}); // Adds fk_companyname to User
有关 http://docs.sequelizejs.com/manual/tutorial/associations.html#target-keys
的更多信息
我知道这个线程有点旧,但我在声明 1:n 关联时遇到问题时偶然发现了它。我正在使用 sequelize 5.21.5。引用属性中键的方式从(借用您的示例)更改为:
companyId: {
type: DataTypes.INTEGER,
references: 'Companies',
referencesKey: 'companyId'
}
至:
companyId: {
type: DataTypes.INTEGER,
references: {
model: 'Company',
key: 'companyId'
}
}
希望这对一路上疲惫的旅行者有所帮助!
我正在使用 sequelize 在我的节点应用程序中为 mySql 数据库模式建模。我的模型的摘录如下所示: 我有一个公司-table和一个部门-table。一个公司可以有多个部门,一个部门只能属于一个公司。我将其建模如下:
公司-table:
module.exports = function(sequelize, DataTypes){
return Company = sequelize.define('Company', {
companyId: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
autoIncrement: true,
unique: true
},
name: {
type: DataTypes.STRING,
allowNull: false
}
})}
部门-table:
var Company = require('./company');
module.exports = function(sequelize,DataTypes) {
return Department = sequelize.define('Department', {
departmentId: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
autoIncrement: true,
unique: true
},
name: {
type: DataTypes.STRING,
allowNull: false
},
companyId: {
type: DataTypes.INTEGER,
references: 'Companies',
referencesKey: 'companyId',
onDelete: 'cascade'
}
});}
为了将此模式实际存储在数据库中,我使用了以下代码:
var db = require('../models/index');
db["Company"].hasMany(db["Department"], {as: 'departments'});
db["Department"].belongsTo(db["Company"], {foreignKey: 'companyId', foreignKeyConstraint: true});
models.sequelize.sync().complete(function(err){
//irrelevant for the problem
});
问题在于此代码在部门 table 中创建了 2 个外键。一个在字段"companyId"(符合预期),一个在字段"CompanyCompanyId",一个自动生成的字段。
如何确保只使用和创建我定义的外键 ('companyId')?
Sequelize 为您创建 foreignKey 字段。因此,如果您使用 belongsTo
.
Department
模型中定义字段 companyId
在当前情况下,它将创建两个外键,一个在模型中定义,另一个通过 belongsTo
定义,当它再次尝试创建外键时,它发现该字段已经存在,因此它创建另一个字段。
我设法解决了问题:
不应仅在 belongsTo 语句中使用 "foreignKey"-选项,还应在 "hasMany"-语句中使用它。
原问题中发布的两个模型保持不变。我唯一需要更改的是 foreignKey 选项的位置:
var db = require('../models/index');
db["Company"].hasMany(db["Department"], {as: 'departments'});
db["Department"].belongsTo(db["Company"], {foreignKey: 'companyId', foreignKeyConstraint: true});
更改为:
var db = require('../models/index');
db["Company"].hasMany(db["Department"], { foreignKey: 'companyId'});
db["Department"].belongsTo(db["Company"], {foreignKey: 'companyId'});
在4.4.0版本中,belongsTo函数有一个targetKey选项。
const User = this.sequelize.define('user', {/* attributes */})
const Company = this.sequelize.define('company', {/* attributes */});
User.belongsTo(Company, {foreignKey: 'fk_companyname', targetKey: 'name'}); // Adds fk_companyname to User
有关 http://docs.sequelizejs.com/manual/tutorial/associations.html#target-keys
的更多信息我知道这个线程有点旧,但我在声明 1:n 关联时遇到问题时偶然发现了它。我正在使用 sequelize 5.21.5。引用属性中键的方式从(借用您的示例)更改为:
companyId: {
type: DataTypes.INTEGER,
references: 'Companies',
referencesKey: 'companyId'
}
至:
companyId: {
type: DataTypes.INTEGER,
references: {
model: 'Company',
key: 'companyId'
}
}
希望这对一路上疲惫的旅行者有所帮助!