Sqlalchemy 与泛型fk的泛型关联:Can';不能摆脱重叠警告

Sqlalchemy 与泛型fk的泛型关联:Can';不能摆脱重叠警告,sqlalchemy,Sqlalchemy,在一个我无法控制的数据库中,我有一个我认为是使用通用外键的数据库。简而言之:通信接口属于路由器或服务器,而不是两者。没有鉴别器,因为ids在整个数据库中是唯一的 为简洁起见,代码缩短: 类服务器(…): __tablename_uu='server' id=列(“oid”,整数,主键=真) 接口=关系( “通信接口”,backref='server', primaryjoin='Server.id==foreign(CommunicationInterface.parent_id)' ) 类路由

在一个我无法控制的数据库中,我有一个我认为是使用通用外键的数据库。简而言之:通信接口属于路由器或服务器,而不是两者。没有鉴别器,因为
id
s在整个数据库中是唯一的

为简洁起见,代码缩短:

类服务器(…): __tablename_uu='server' id=列(“oid”,整数,主键=真) 接口=关系( “通信接口”,backref='server', primaryjoin='Server.id==foreign(CommunicationInterface.parent_id)' ) 类路由器(…): __tablename_uu='路由器' id=列(“oid”,整数,主键=真) 接口=关系( “通信接口”,backref='router', primaryjoin='Router.id==foreign(CommunicationInterface.parent_id)' ) 类通信接口(…): __tablename_uuu='communicationinterface' id=列(“oid”,整数,主键=真) 父项id=列(“父项id”,整数) 重叠='路由器,服务器' 路由器=关系( “路由器”,背面填充class='interfaces',重叠=重叠, primaryjoin='Router.id==foreign(CommunicationInterface.parent_id)' ) 服务器=关系( “服务器”,背面填充class='interfaces',重叠=重叠, primaryjoin='Server.id==foreign(CommunicationInterface.parent_id)' ) 即使使用“重叠”参数,仍会出现如下警告:

警告:关系“Router.interfaces”将复制列Router.\u oid到列通信接口.\u parent\u oid,它与关系冲突:'communicationinterface.server'(将elb\u server.\u oid复制到elb\u通信接口.\u parent\u oid)。如果这不是意图,那么考虑这些关系是否应该与Buffy填充关联,或者如果VIEWION=真应该应用于一个或多个,如果它们是只读的。对于外键约束部分重叠的不太常见的情况,可以使用orm.foreign()注释来隔离应该写入的列。“重叠”参数可用于删除此警告


有没有更好的方式来宣布这些关系?如果不是,我是否使用了
overlaps
参数错误?

您面临的问题有几个原因:

  • 混合使用
    backref
    back\u填充
    
    • backref
      还可以在另一侧创建
      关系
    • back\u填充
      期望另一端有一个
      关系
  • 重叠
    另一侧的
    关系
    缺失不正确
这将解决您的问题:

类服务器(基本):
__tablename_uu='server'
id=列(“oid”,整数,主键=真)
类路由器(基本):
__tablename_uu='路由器'
id=列(“oid”,整数,主键=真)
类通信接口(基本):
__tablename_uuu='communicationinterface'
id=列(“oid”,整数,主键=真)
父项id=列(“父项id”,整数)
路由器=关系(
“路由器”,backref=backref('interface',lazy='subquery',overlaps='server,interface'),
primaryjoin='Router.id==foreign(CommunicationInterface.parent_id)'
)
服务器=关系(
'Server',backref=backref('interface',lazy='subquery',overlaps='router'),overlaps='router',
primaryjoin='Server.id==foreign(CommunicationInterface.parent_id)'
)
或者,如果要使用
back\u填充执行此操作

类服务器(基本):
__tablename_uu='server'
id=列(“oid”,整数,主键=真)
接口=关系(
“通信接口”,背面填充“服务器”,重叠“路由器”,
primaryjoin='Server.id==foreign(CommunicationInterface.parent_id)'
)
类路由器(基本):
__tablename_uu='路由器'
id=列(“oid”,整数,主键=真)
接口=关系(
“通信接口”,背面填充“路由器”,重叠“服务器,接口”,
primaryjoin='Router.id==foreign(CommunicationInterface.parent_id)'
)
类通信接口(基本):
__tablename_uuu='communicationinterface'
id=列(“oid”,整数,主键=真)
父项id=列(“父项id”,整数)
路由器=关系(
“路由器”,背面填充“接口”,
primaryjoin='Router.id==foreign(CommunicationInterface.parent_id)'
)
服务器=关系(
“服务器”,背面填充class='interface',重叠class='router',
primaryjoin='Server.id==foreign(CommunicationInterface.parent_id)'
)

谢谢。不幸的是,这对我仍然不起作用。故障排除期间发生了
backref
/
反向填充
混淆。可能相关:实际上,除了
服务器
路由器
之外,我还有一个实体指向
通信接口
。另外,
overlaps
参数的逻辑是什么?您似乎在其中一个中使用了
'server,interface'
,但在另一个中只使用了
路由器
。我接受了这个答案,因为多亏了这个,我终于让它工作了。在第一个示例中,
router
关系(不在backref中)中的
overlaps='server,interface'
参数似乎是缺少的。我认为重叠定义有点模糊。但这似乎与定义的顺序有关。在表对象求值期间,我查看了代码库a,并将新关系与重叠参数进行了比较。我费了好几次周折才把它弄好。