Sequelize 复合外键

2023-12-25

我有一个包含下表的数据库:

CREATE TABLE IF NOT EXISTS `app_user` (
  `user_id` INT NOT NULL,
  `user_name` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`user_id`))
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `user_folder` (
  `user_id` INT NOT NULL,
  `document_id` INT NOT NULL,
  PRIMARY KEY (`user_id`, `document_id`),
  CONSTRAINT `fk_user_document_user`
    FOREIGN KEY (`user_id`)
    REFERENCES `zinc`.`app_user` (`user_id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `folder_content` (
  `user_id` INT NOT NULL,
  `document_id` INT NOT NULL,
  `content_id` INT NOT NULL,
  PRIMARY KEY (`user_id`, `document_id`, `content_id`),
  CONSTRAINT `fk_folder_content_folder`
    FOREIGN KEY (`user_id` , `document_id`)
    REFERENCES `zinc`.`user_folder` (`user_id` , `document_id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;

我需要创建一个 Sequelize 模型来表示它。我遇到的唯一问题是由于复合键而导致的folder_content 和user_folder 关系。

我怎样才能创建这个续集模型?

这是我到目前为止所拥有的:

var AppUser = sequelize.define('app_user', 
{userId: {type: Sequelize.INTEGER, primaryKey: true, field: 'user_id'}, ... } );

var UserFolder = sequelize.define('user_folder', 
{userId: {type: Sequelize.INTEGER, primaryKey: true, field: 'user_id'}, 
documentId: {type: Sequelize.INTEGER, primaryKey: true, field: 'document_id'}... });

var FolderContent = sequelize.define('folder_content', {
userId: {type: Sequelize.INTEGER, primaryKey: true, field: 'user_id'}, 
documentId: {type: Sequelize.INTEGER, primaryKey: true, field: 'document_id'}, 
contentId: {type: Sequelize.INTEGER, primaryKey: true, field: 'content_id'}... });


UserFolder.hasMany(FolderContent);
FolderContent.belongsTo(UserFolder, {foreingKey: !! });// <- PROBLEM

现在 Sequelize 不支持复合外键。这会产生几个问题。

  1. 当Sequelize创建表时,表定义没有复合FK。
    为了解决这个问题我使用afterSync挂钩模型和函数 如果 FK 不存在,则将其添加到表中。示例代码 http://plnkr.co/edit/OoRyXlzg0G8e9siiCir1?p=info.
  2. 当我使用findAll方法与include这样的模型,我使用include[].on的选项findAll方法。或者,如果您不像我一样使用那么多连接,您可以使用scope创建关联时(see https://github.com/sequelize/sequelize/issues/311#issuecomment-354640679).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sequelize 复合外键 的相关文章

随机推荐

  • 如何在 C# 中使用 SevenZipSharp/Unrar 知道哪个 rar 是多个 rar 存档中的第一个?

    我正在尝试在 C WinForms NET 3 5 中使用 SevenZipSharp 或 和 Unrar 库 我遇到了具有不同命名的多个 rar 存档的问题 例如 rar r01 r02 r03 等 这很简单 somefile01 rar
  • “免费”的冲突类型

    我收到错误 免费 的冲突类型 打电话给free 下面的函数 int main char fx x 2 5 x 1 node fxNode buildTree fx sizeof fx sizeof char printf deriveFro
  • Portlet 桥有什么作用?

    在今天的一次采访中 我提到我在 portlet 中完成了一些 jsf 工作 面试官询问了 portlet bridge 的具体功能 我从来没有深入研究过它 只是使用它 因为我被告知它可以让 jsf 在 portlet 中工作 我真正能说的是
  • “CSV 不存在”-Pandas DataFrame [重复]

    这个问题在这里已经有答案了 我在将 csv 文件读入 pandas 数据框中时遇到困难 我是 pandas 的新手 这阻碍了我的进步 我已阅读文档并搜索解决方案 但无法继续 我已经尝试过以下方法但无济于事 import pandas as
  • POCO、DTO、DLL 和贫血域模型

    我正在看POCO和DTO的区别 https stackoverflow com questions 725348 poco vs dto 看起来 POCO 是具有行为 方法 的 dto 并遇到本文 http www martinfowler
  • 在 VS2008 中调试 Windows x64 上的 x86 .NET 应用程序

    我使用 x64 版本的 Windows 7 我的应用程序使用一些无法在 x64 上下文中加载的 COM 服务器 通常是本机 x86 COM 服务器 所以我决定将其作为 x86 应用程序运行WOW http en wikipedia org
  • Oracle SQL如何找出哪个表有以下两列?

    我知道我可以发出一个声明来查找包含我正在查找的列的表 SELECT DISTINCT table name FROM all tab cols WHERE column name EMP ID 但是 我应该如何修改它 以便我可以找到两者都说
  • SQL Server:根据提供的行值为每行运行函数

    我仍在学习 SQL 我在想如何将行值传递到一个函数中cross apply query 假设这是我的第一张桌子 SELECT Project emp id Allocation start Allocation end FROM First
  • Next Auth.js 令牌长度和 Cognito 的问题

    我正在尝试使用 NextAuth js 和 Cognito 在我的 Next js 应用程序中实现身份验证 这是我的问题 当调用 jwt 回调时 我想在会话中存储 3 个令牌和其他内容 但令牌最大长度为 4096 字节 我怎样才能实现这个
  • 添加单个字符以在 Counter 中添加键

    如果 Counter 对象的键的类型是str i e 我可以这样做 gt gt gt vocab counter Counter the lazy fox jumps over the brown dog split gt gt gt vo
  • Python:打印一个简单的函数[重复]

    这个问题在这里已经有答案了 我是 Python 和一般编程的绝对初学者 而且我刚刚第一次接触函数 我在下面定义了两个简单的函数 def output1 print Hello world def output2 print Hello th
  • ValueError:操作数无法与形状 (5,) (30,) 一起广播

    我正在尝试像这样合并数组 If a 1 2 1 3 4 b 0 0 0 0 c 0 0 0 0 a a b c 那么结果应该是 0 0 0 0 1 2 1 3 4 0 0 0 0 我所做的是提取数组的直方图 并将其与普通数组合并 x1 bi
  • 找不到文件 mysql-connector-java-5.1.13-bin.jar

    您好 当我尝试从 netbeans 站点运行 sakila 数据库示例时https netbeans org projects samples downloads download Samples JavaEE DVDStoreEE6 zi
  • TIdHTTP:选择 HTTP 请求的传出 IP?

    我有一台机器 有几个不同的静态IP 是否可以通过以下方式选择 HTTP 请求的传出 IP 地址TIdHTTP Indy 印地的新版本有BoundIP idHttp1 BoundIP 144 33 34 212
  • 在类型系统的上下文中什么是“种类”?

    我已经阅读了维基百科文章并搜索了明显的地方 但我被困住了 有人可以简单地告诉我 Kind 到底是什么吗 它是干什么用的 Scala 示例最受欢迎 简而言之 kind is to types what a type is to values
  • 禁止系统使用 Meteor 帐户?

    我正在使用 Meteor 开发一个聊天应用程序 它使用 account ui 和 account twitter 我希望能够禁止人们滥用该网站 但我不确定如何做到这一点 或者是否可能 有没有办法做到这一点 这是我用来运行聊天应用程序部分的代
  • ScrollView 布局或其RelativeLayout 父级可能没用

    我正在开发 Android 4 及以上版本的应用程序 一层生成此警告 此 ScrollView 布局或其relativelayout 父级可能是无用的 将背景属性传输到另一个视图
  • 使用 css 设置表格中最后一个 td 的样式

    我想设置表中最后一个 TD 的样式 而不在特定 TD 上使用 CSS 类 table tbody tr td One td td Two td td Three td td Four td td Five td tr tbody table
  • 为什么洗牌 list(range(n)) 比洗牌 [0]*n 慢?

    Using random shuffle 我注意到洗牌list range n 比洗牌多花费约 25 的时间 0 n 这是尺寸的时间n从 100 万到 200 万 为什么是洗牌list range n 慢点 与对列表进行排序 需要查看对象
  • Sequelize 复合外键

    我有一个包含下表的数据库 CREATE TABLE IF NOT EXISTS app user user id INT NOT NULL user name VARCHAR 45 NOT NULL PRIMARY KEY user id