Sequelize.js 如何让sequelize为联接表创建id?
请参见以下模型和关系:Sequelize.js 如何让sequelize为联接表创建id?,sequelize.js,Sequelize.js,请参见以下模型和关系: var User = sequelize.define('user', { name: {type: Sequelize.STRING, unique: true}, password: Sequelize.STRING, email: Sequelize.STRING }); var Group = sequelize.define('group', { name: Sequelize.STRING, }); var Membership = seq
var User = sequelize.define('user', {
name: {type: Sequelize.STRING, unique: true},
password: Sequelize.STRING,
email: Sequelize.STRING
});
var Group = sequelize.define('group', {
name: Sequelize.STRING,
});
var Membership = sequelize.define('membership', {
foo: Sequelize.STRING
});
var Query = sequelize.define('query', {
text: Sequelize.STRING,
});
User.belongsToMany(Group, {through: Membership});
Group.belongsToMany(User, {through: Membership});
Query.belongsTo(Membership);
Membership.hasMany(Query);
为什么sequelize不为成员身份创建id列?我怎样才能让它创造它?为什么要创建名为membershipGroupId
的列
为了回答@denisazevedo,我使用了sync
和force
。下面是同步的输出
Executing (default): DROP TABLE IF EXISTS `memberships`;
Executing (default): DROP TABLE IF EXISTS `groups`;
Executing (default): DROP TABLE IF EXISTS `cookies`;
Executing (default): DROP TABLE IF EXISTS `events`;
Executing (default): DROP TABLE IF EXISTS `clients`;
Executing (default): DROP TABLE IF EXISTS `users`;
Executing (default): DROP TABLE IF EXISTS `results`;
Executing (default): DROP TABLE IF EXISTS `queries`;
Executing (default): DROP TABLE IF EXISTS `queries`;
Executing (default): CREATE TABLE IF NOT EXISTS `queries` (`id` INTEGER NOT NULL auto_increment , `text` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `membershipGroupId` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM `queries`
Executing (default): DROP TABLE IF EXISTS `results`;
Executing (default): CREATE TABLE IF NOT EXISTS `results` (`id` INTEGER NOT NULL auto_increment , `link` VARCHAR(2048), `description` TEXT, `result_order` FLOAT(5,2), `title` VARCHAR(255), `result_relevance` ENUM('up', 'down', 'none'), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `queryId` INTEGER, PRIMARY KEY (`id`), FOREIGN KEY (`queryId`) REFERENCES `queries` (`id`) ON DELETE SET NULL ON UPDATE CASCADE) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM `results`
Executing (default): DROP TABLE IF EXISTS `users`;
Executing (default): CREATE TABLE IF NOT EXISTS `users` (`id` INTEGER NOT NULL auto_increment , `name` VARCHAR(255) UNIQUE, `password` VARCHAR(255), `email` VARCHAR(255), `role` ENUM('facilitator', 'participant'), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM `users`
Executing (default): DROP TABLE IF EXISTS `clients`;
Executing (default): CREATE TABLE IF NOT EXISTS `clients` (`id` INTEGER NOT NULL auto_increment , `socketid` VARCHAR(255), `connected` DATETIME, `disconnected` DATETIME, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `userId` INTEGER, PRIMARY KEY (`id`), FOREIGN KEY (`userId`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM `clients`
Executing (default): DROP TABLE IF EXISTS `events`;
Executing (default): CREATE TABLE IF NOT EXISTS `events` (`id` INTEGER NOT NULL auto_increment , `description` TEXT, `type` ENUM('vote_up', 'vote_down', 'critisort', 'originalsort', 'logout', 'login', 'follow', 'search'), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `clientId` INTEGER, `resultId` INTEGER, `queryId` INTEGER, PRIMARY KEY (`id`), FOREIGN KEY (`clientId`) REFERENCES `clients` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, FOREIGN KEY (`resultId`) REFERENCES `results` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, FOREIGN KEY (`queryId`) REFERENCES `queries` (`id`) ON DELETE SET NULL ON UPDATE CASCADE) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM `events`
Executing (default): DROP TABLE IF EXISTS `cookies`;
Executing (default): CREATE TABLE IF NOT EXISTS `cookies` (`id` INTEGER NOT NULL auto_increment , `key` VARCHAR(255), `uid` VARCHAR(255) UNIQUE, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM `cookies`
Executing (default): DROP TABLE IF EXISTS `groups`;
Executing (default): CREATE TABLE IF NOT EXISTS `groups` (`id` INTEGER NOT NULL auto_increment , `name` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `ownerId` INTEGER, PRIMARY KEY (`id`), FOREIGN KEY (`ownerId`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM `groups`
Executing (default): DROP TABLE IF EXISTS `memberships`;
Executing (default): CREATE TABLE IF NOT EXISTS `memberships` (`foo` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `groupId` INTEGER , `userId` INTEGER , PRIMARY KEY (`groupId`, `userId`), FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (`userId`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM `memberships`
Membership
中的外键是按照您在SQL中看到的预期创建的:
groupId
userId
会员资格
拥有自己的ID,您需要手动将其添加到表中,如中所述:
默认情况下,上面的代码将向
UserProjects表,并删除以前定义的任何主键
属性-表将由组合唯一标识
这两个表的键,没有理由有其他PK
柱。要在UserProjects模型上强制执行主键,可以
手动添加
UserProjects = sequelize.define('userProjects', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
status: DataTypes.STRING
})
我建议阅读全文,因为它包含有用的信息。调用
sync
方法时,日志中生成的SQL是什么?你是在强制创建表吗?我想是因为你是通过某个属性定义关系的-{through:Membership}
刚刚再次搜索了这个,我不记得我在哪里找到了q/a,我有更多的投票支持你@deniszevedo再次感谢