Postgres非public schema中的外键约束

8
我有一个关于自定义模式下的约束限制的问题。我的应用程序为每个客户端创建一个新的/分离的模式,对应于客户端的名称(即clientaclientb等)。一些表具有外键约束,但它们只能在除默认public模式之外的模式上工作。例如,假设有一个名为clienta的模式,它有projectstasks表,模型Task具有belongsTo(models.Project)关联(即projectsprimary_key是表tasks的一个foreign_key)。问题从这里开始:当尝试在表tasks中创建记录时,会出现一个错误,指出foreign key violation error... Key (project_id)=(1) is not present in table "projects...,即使projects表具有相应的id=1的记录。我想知道这是sequelize库本身的限制还是我的配置中缺少了什么。 Sequelize配置
"development": {
    "database": "my_app",
    "host": "127.0.0.1",
    "dialect": "postgres",
    "operatorsAliases": "Sequelize.Op",
    "dialectOptions": {
      "prependSearchPath": true
    },
    "define": {
      "underscored": true
    }
  }

create函数的示例:

models.Task.create({...args}, { searchPath: 'clienta' })

注意:public模式下一切如预期般工作。


1
请发布导致失败的确切DDL以及您在尝试执行时遇到的错误。 - The Impaler
错误日志中的主要信息是我上面发布的那个。问题并不特定于一个问题。它更多地涉及配置/设置或了解sequelize库可以提供和不能提供的内容。 - bir_ham
@bir_ham 问题似乎在于创建的表具有约束条件,如果其模式与公共模式不同,则这些约束条件无法正确对齐。最少需要提供的信息是您如何定义这些约束条件。如果我是一个赌徒,我会猜测您'clienta'表的约束实际上依赖于具有'public'模式的表 - 但这构成了赌博(可以使用pgAdmin或任何类似工具轻松检查)。 - Koen
@Koen 那也是我的最初假设,并删除了公共模式中表的约束。然而,同一模式中的表的约束仍在不断下降。正如我在问题中所述,表projectstasks位于同一模式(clientaclientb或任何模式)中。 - bir_ham
@bir_ham - 问题是 - 当您定义约束时,您是指公共表还是同一模式中的特定表?因此需要请求定义。 - Koen
@Koen 你说得很对!我的约束条件前缀是“public”。我使用sequelize的模型sync助手动态创建了我的表(例如Project.sync({schema: testa})),这确实创建了一个表,但不足以将约束条件分配给相应的模式。我在sync选项中添加了searchPath选项(例如Model.sync({schema: testa, searchPath: testa})),现在它可以工作了。谢谢!你值得获得赏金奖励! - bir_ham
1个回答

1

同步方法API列出了两个与DB-schema相关的选项:

options.schema - 表应该创建在的模式

options.searchPath - 可选参数,用于设置搜索路径(Postgresql)

当使用除默认模式以外的模式并创建了模型之间的关联(例如使用belongsTo),重要的是将searchPath设置为目标表的模式名称。根据postgresql中的search_path中的解释,不指定searchPath将使约束引用默认模式(通常为'public')中的表(如果存在)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接