gpt4 book ai didi

python - 将 __table_args__ 与 SQLAlchemy 中的 mixin 类的约束相结合

转载 作者:太空狗 更新时间:2023-10-29 21:37:21 35 4
gpt4 key购买 nike

在 SQLAlchemy 中,我已经阅读了如何在声明声明时组合来自不同 mixin 的 __table_args__

Combining Table/Mapper Arguments from Multiple Mixins

我的问题是,该示例显示了这是如何在链的末端(MRO 中的最后一类)完成的,但是如果我有这些 Mixin 并希望它发生在MyClientMixinBase 类以避免为其他类型的 mixin 复制此代码?

class LaneCarrierCommitmentSummaryMixin(object):
""" Lane Carrier Commitment Summary.

A base class for LCCS to mixin with a client specific class.
"""

__tablename__ = 'lane_carrier_commitment_summary'
__table_args__ = ((UniqueConstraint(['hashmap_key', 'bow'],
name='uq_lane_carrier_commitment_summary_hashmap_key_bow')),)

class MyClientMixin(object):
""" MyClient Mixin class for providing the ETL schema. """

__table_args__ = {'schema': 'myclient_etl'}

class MyClientLaneCarrierCommitmentSummary(LaneCarrierCommitmentSummaryMixin, DateTrackedMixin, MyClientMixin, Base):
pass

我对这个概念有点纠结。

最佳答案

该基类将搜索所有混合类以查找要添加的 __table_args__,然后检查当前类以查找要添加的 __local_table_args__。这样,__local_table_args__ 就不会与声明的属性发生冲突。基类 (cls.mro()) 以相反的顺序检查,以便链中较低的混入被较高的混入覆盖。

def _process_args(cls, attr, out_args, out_kwargs):
try:
args = getattr(cls, attr)
except AttributeError:
return

if isinstance(args, Mapping): # it's a dictionary
out_kwargs.update(args)
else: # it's a list
if isinstance(args[-1], Mapping): # it has a dictionary at the end
out_kwargs.update(args.pop())

out_args.extend(args)

class Base():
@declared_attr
def __mapper_args__(cls):
args = []
kwargs = {}

for mixin in reversed(cls.mro()):
_process_args(mixin, '__mapper_args__', args, kwargs)

_process_args(mixin, '__local_mapper_args__', args, kwargs)

return kwargs # mapper only takes dict

@declared_attr
def __table_args__(cls):
args = []
kwargs = {}

for mixin in reversed(cls.mro()):
_process_args(mixin, '__table_args__', args, kwargs)

_process_args(cls, '__local_table_args__', args, kwargs)

args.append(kwargs) # [item, item, ..., kwargs]
return tuple(args)

您所有的 mixins 都应该像往常一样定义 __table_args__,但是从 Base 继承的“真实”类应该定义 __local_table_args__

关于python - 将 __table_args__ 与 SQLAlchemy 中的 mixin 类的约束相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23415638/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com