- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个名为 pbx_point
的父表,它有一个 point_type
列。我还有一个名为 pbx_route
的子表,其中有一列名为 point_id
指向 pbx_point
。
我想使用 sqlalchemy 的连接表继承通过声明性基础将这两个表关联起来,并使用多态继承
这工作正常 - 或者更确切地说,如果没有以下附加约束,它会工作:pbx_point
也有一个名为 initial_route_id
的外键指向 pbx_route
.
我也在下面使用反射,但数据库与我上面描述的一样。我得到的错误是 sqlalchemy.exc.AmbiguousForeignKeysError: Can't determine join between 'pbx_point' and 'pbx_route';表之间有多个外键约束关系。请明确指定此连接的“onclause”。
。
这是有道理的,因为“幕后”声明基础正在两个映射类上创建一个 relationship() 属性。我希望它选择 pbx_route.point_id
作为 parent_id 链接,但它也会看到 pbx_point.initial_route_id
列。如果我正在创建此 relationship(),这将很容易修复,但我不是 - 声明式继承系统是。
有没有我可以传递给 __mapper_args__
的附加参数,例如 polymorphic_parent_col
可以让我指定我想要的外键?如果没有,我该如何解决这个问题?
谢谢。
class MyBase(DeferredReflection):
@declared_attr
def __tablename__(cls):
return cls.__name__.lower()
Base = declarative_base(cls=MyBase)
class pbx_point(Base):
__mapper_args__ = dict(
polymorphic_on='point_type',
with_polymorphic='*',
)
class pbx_route(pbx_point):
__mapper_args__ = dict(polymorphic_identity='pbx.route')
这是我得到的堆栈跟踪:
Traceback (most recent call last):
File "db.py", line 50, in <module>
Base.prepare(engine)
File "env/local/lib/python2.7/site-packages/sqlalchemy/ext/declarative/api.py", line 431, in prepare
thingy.map()
File "env/local/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.py", line 379, in map
**mapper_args
File "env/local/lib/python2.7/site-packages/sqlalchemy/orm/__init__.py", line 1147, in mapper
return Mapper(class_, local_table, *args, **params)
File "env/local/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 213, in __init__
self._configure_inheritance()
File "env/local/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 517, in _configure_inheritance
self.local_table)
File "env/local/lib/python2.7/site-packages/sqlalchemy/sql/util.py", line 397, in join_condition
"join explicitly." % (a.description, b.description))
sqlalchemy.exc.AmbiguousForeignKeysError: Can't determine join between 'pbx_point' and 'pbx_route'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly.
这表明它正在死于 line 1032 in mapper.py *。上面的几行引用了映射器 kwarg inherit_condition
,这似乎是我需要的。
[*]:源链接调整为1.3.11版本(之前的URL现在是404s)
最佳答案
关键是 inherit_condition
映射器的参数。多态信息实际上与这一步没有任何关系。
修正模型:
class MyBase(DeferredReflection):
@declared_attr
def __tablename__(cls):
return cls.__name__.lower()
Base = declarative_base(cls=MyBase)
class pbx_point(Base):
__mapper_args__ = dict(
polymorphic_on='point_type',
with_polymorphic='*',
)
id = Column(Integer, primary_key=True)
class pbx_route(pbx_point):
point_id = Column(Integer, ForeignKey(pbx_point.id))
__mapper_args__ = dict(
polymorphic_identity='pbx.route',
inherit_condition=(point_id == pbx_point.id)
)
我需要添加 id
和 point_id
列以在 inherit_condition
参数中使用它们。可能有一种方法可以只使用反射来做到这一点,但这并不是一个可怕的障碍。
关于python - 在sqlalchemy中,当子表有多个父表的外键时,如何使用多态连接表继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14885042/
我有一个包含在父 ScrollView (不是直接 subview )中的子 ScrollView 。我想要的是,一旦子 ScrollView 到达其内容的末尾,父 ScrollView 就开始沿相同
我有一个典型的 MVVM 场景: 我有一个绑定(bind)到 StepsViewModels 列表的 ListBox。 我定义了一个 DataTemplate,以便将 StepViewModels 呈
我的 firebase 数据库的结构如下图所示 image of my firebase DB stucture 每当有新消息时,它都会添加到特定的 ID 下,如图所示,它是“59a004ce9bfe
基本上,我的目标是尝试为整个 Web 项目创建一个键盘 Controller ,并且我希望能够保留在父文档上创建的键绑定(bind),并让子 iframe 继承它们。这可能吗? 这是我现在拥有的示例设
我正在开发一个 asp.net 网络应用程序。 有一个母版页的子窗体。母版页没有定义任何高度,但它为 子窗体 定义了一个 X px 高度。 在子表单上它有一个 fieldset 容器,在这 2 个 t
我有一个包含 PictureBox 和 Label 的 UserControl。控件在不同的事件(例如 onMouseEnter、OnMouseLeave)时在 PictureBox 中加载三个不同的
我有一个 viewpager,在其中一个 fragment 中,我有两个单独的 fragment ,分别包含一个垂直和一个水平的 recyclerview。 当我将水平 recyclerview 滚动
我正在尝试抽象一个我在应用程序中经常使用的模式,我可以在另一个屏幕中使用它,该屏幕应该发送来自另一个屏幕内的 TextInput 组件的 Prop 。问题是,当我将 TextInput 组件留空时,它
嵌套滚动? 我在 PageView 中有三个垂直页面我希望能够在两者之间切换。 页面由可滚动的 ListView 组成s。 当页面处于焦点时,显示的列表应该是垂直可滚动的,但是当列表滚动到任一端时,我
这个问题的 jsFiddle 可以在这里找到:http://jsfiddle.net/Hsw9F/1/ JavaScript(console.log 调试信息可在 jsFiddle 中找到) var
HTML: Software Update 2010
我正在制作一个响应式网站。我有 3 个 div (.block),我需要将它们水平放置在一起。 当屏幕足够宽时,这很容易实现。但是,当我使浏览器更窄时,第三个 div (3) 换行到下一行,但我想要的
资源和背景 https://jsfiddle.net/wwx100f8/69/ 我正在尝试创建一个可扩展/可折叠的 Accordion 来容纳餐厅的食物选项,这是一个类似于 Just-Eat 或 Hu
我有一个嵌套的 ViewPager,效果非常好。唯一的问题是,一旦子 ViewPager 位于最后一项并且我进一步滚动,父 ViewPager 就会滚动。我不想要这种行为。 我如何实现这一目标? 这是
例如,我有主要 Activity 。我打电话的地方: Intent callchild = new Intent(this, childActivity.class); startActivity(c
我有一个定义 FormGroup 的 Angular 组件,它有一个嵌套的 FormGroup 作为它的控件之一。 子 FormGroup 作为 @Input 参数传递给子 component,并且在
这个问题与another question I asked有关 基本上,我有 2 个水平对齐的 div。两者都位于名为“.Parent”的 div 中,因此结构如下: s
基本上我需要 div.content 具有 15px 的默认填充,除非 div 具有子 div.products-list。如果 .products-list 的子 div 存在,我需要 div.co
代码笔:http://codepen.io/anon/pen/qaVRqw 我试图让 innerDiv 在文本超出父 div 之前换行文本。让所有文本都显示在 innerDiv 中但又被换行的最佳方式
我有一个名为 main 的父 div。它有一堆子 div,我向左或向右浮动。 当我完成最后一个 float 时,主 div 的高度完全消失,打乱了我的页面布局。我给了它一个高度:100%;只是现在,但
我是一名优秀的程序员,十分优秀!