Sequelize.js外键

swa*_*ess 32 mysql orm node.js sequelize.js

使用Sequelize.js时,以下代码不会在表上添加任何外键.

var MainDashboard = sequelize.define('main_dashboard', {
  title: Sequelize.STRING
}, {
  freezeTableName: true
})

MainClient.hasOne(MainDashboard, { foreignKey: 'idClient' })
MainDashboard.hasOne(MainClient, { foreignKey: 'clientId' })

sequelize.sync({ force: true })
Run Code Online (Sandbox Code Playgroud)

有没有办法强制Sequelize.js添加这些外键约束?

小智 30

在我遇到同样的问题之前,当我理解设置Sequelize的功能时解决了.

开门见山!

假设我们有两个对象:PersonFather

var Person = sequelize.define('Person', {

        name: Sequelize.STRING
});

var Father = sequelize.define('Father', {

        age: Sequelize.STRING,
        //The magic start here
        personId: {
              type: Sequelize.INTEGER,
              references: 'persons', // <<< Note, its table's name, not object name
              referencesKey: 'id' // <<< Note, its a column name
        }
});

Person.hasMany(Father); // Set one to many relationship
Run Code Online (Sandbox Code Playgroud)

也许它可以帮到你

编辑:

您可以阅读此内容以更好地理解:

http://docs.sequelizejs.com/manual/tutorial/associations.html#foreign-keys

  • 这不是一个好例子,最后一个命令说"一个人有很多父亲"听起来不自然 (20认同)
  • 现在不推荐使用`references`和`referencesKey` =>`找不到实用程序的非对象引用属性.对此的支持将在版本4中删除.预期{references:{model:"value",key:"key"}}而不是{references:"value",referencesKey:"key"} .` (9认同)

Joh*_*edy 11

对于Sequelize 4,它已更新为以下内容:

const Person = sequelize.define('Person', {
        name: Sequelize.STRING
});

const Father = sequelize.define('Father', {
    age: Sequelize.STRING,
    personId: {
       type: Sequelize.INTEGER,
       references: {
          model: 'persons', // 'persons' refers to table name
          key: 'id', // 'id' refers to column name in persons table
       }
    }
});

Person.hasMany(Father); // Set one to many relationship
Run Code Online (Sandbox Code Playgroud)


Jan*_*ier 6

我只是试图运行你的代码,似乎创建了行:

CREATE TABLE IF NOT EXISTS `main_dashboard` (`title` VARCHAR(255), `id` INTEGER NOT NULL auto_increment , `idClient` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `main_client` (`id` INTEGER NOT NULL auto_increment,  `clientId` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

clientId被添加到main_client,并被idClient添加到main_dashboard

看来你有点混淆了hasOne方法的作用.每次调用hasOne时都会创建一个关联,因此您的代码会有效地将两个表关联两次.你正在寻找的方法是belongsTo

如果您希望每个客户端都有一个仪表板,则代码如下:

MainClient.hasOne(MainDashboard, { foreignKey: 'clientId' })
MainDashboard.belongsTo(MainClient, { foreignKey: 'clientId' })
Run Code Online (Sandbox Code Playgroud)

这将在main_dashboard表上创建一个clientId字段,该字段与main_client表的id字段相关

简而言之,belongsTo添加与您调用方法的表的关系,hasOne将其添加到作为参数给出的表中.


Far*_*arm 6

你需要添加foreignKeyConstraint:true
试试

MainClient.hasOne(MainDashboard, { foreignKey: 'idClient' , foreignKeyConstraint:true })
Run Code Online (Sandbox Code Playgroud)