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,并将新关系与重叠参数进行了比较。我费了好几次周折才把它弄好。