如何让PostGraphile识别Uploads与Parties的多对多关联
PostGraphile 多对多关联识别问题
我有一张Uploads表,该表与Parties表为**多对多(many-to-many)**关系,关联表是Uploads_Parties,包含upload_id和party_id两个字段。请问如何让PostGraphile在生成Schema时自动识别这一关联?
已尝试方案
- 使用pg-many-to-many插件,但添加后无效果;
- 使用smart tags插件,尝试添加
Uploads.upload_id -> Uploads_Parties.upload_id的外键关系,PostGraphile启动时报错。
服务器初始化代码
const SmartTagsPlugin = makePgSmartTagsFromFilePlugin( resolve(__dirname, '../../postgraphile.tags.jsonc'), ); // ... appendPlugins: [ SmartTagsPlugin, PgManyToManyPlugin ] // ...
tags.jsonc 配置内容
{ "config": { "class": { "upload_service.upload": { "tags": { "foreignKey": [ "(id) references upload_service.uploads_parties (upload_id)|@fieldName uploadDataSet" ] } } } } }
解决方法
1. 补全数据库外键约束
PostGraphile及其插件依赖数据库原生外键来识别关联关系,先给关联表补全外键:
-- 给uploads_parties添加指向uploads的外键 ALTER TABLE upload_service.uploads_parties ADD CONSTRAINT fk_uploads_parties_upload FOREIGN KEY (upload_id) REFERENCES upload_service.uploads(id); -- 添加指向parties的外键 ALTER TABLE upload_service.uploads_parties ADD CONSTRAINT fk_uploads_parties_party FOREIGN KEY (party_id) REFERENCES upload_service.parties(id);
没有正确的外键约束,插件无法自动解析多对多关联。
2. 修正pg-many-to-many插件配置
- 确认安装对应版本的插件:
npm install @graphile-contrib/pg-many-to-many - 启动时确保插件在
appendPlugins中,且顺序正确(smart tags插件可放在前面)
3. 修复smart tags配置
你的tags配置方向错误,应该针对关联表而非主表。正确配置如下:
{ "config": { "class": { "upload_service.uploads_parties": { "tags": { "manyToMany": "uploads, parties" } } } } }
该配置会告知PostGraphile,uploads_parties是uploads与parties之间的多对多关联表。
4. 校验名称一致性
检查数据库表名、schema名(如upload_service)在代码、配置中的拼写和大小写是否完全一致,PostGraphile对名称大小写敏感。
5. 清理缓存重启服务
PostGraphile会缓存生成的Schema,修改配置或数据库结构后,删除.postgraphile-cache目录,再重启服务让Schema重新生成。
内容的提问来源于stack exchange,提问作者Itay Tur
相关产品推荐
相关产品推荐

