- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 SQLAlchemy 中,我已经阅读了如何在声明声明时组合来自不同 mixin 的 __table_args__
。
Combining Table/Mapper Arguments from Multiple Mixins
我的问题是,该示例显示了这是如何在链的末端(MRO 中的最后一类)完成的,但是如果我有这些 Mixin 并希望它发生在MyClientMixin
或 Base
类以避免为其他类型的 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/
我发现如果 __table_args__ 存在于单表继承设置中的子类中,SQLAlchemy 会抛出 sqlalchemy.exc.ArgumentError: Can't place __table
我没有使用 sqlalchemy 的经验,我有以下代码: class ForecastBedSetting(Base): __tablename__ = 'forecast_bed_set
假设我有这样的表 class Base(object): id = Column(Integer, primary_key=True) date_updated = Column(Da
是否可以使用外键引用并在 sqlalchemy 中的同一个表上有 oracle 分区? 这是在 __table_args__ 中将 oracle 分区定义为字典的方式 class SQLAlchemy
我正在尝试在基类中使用单个 CheckConstraint 创建基模型。当我将基类混合到 flask-sqlalchemy 模型中并尝试使用它时,我得到“无法将未命名的列添加到列集合”。 我试着用不同
我正在尝试使用flask、sqlalchemy 和flask_migrate ... 但是每次运行 manage.py migrate 时,alembic 总是将我的模型检测为新表。 我想我把 tab
在 SQLAlchemy 中,我已经阅读了如何在声明声明时组合来自不同 mixin 的 __table_args__。 Combining Table/Mapper Arguments from Mu
我有以下 SQLAlchemy 模型。已成功迁移至数据库: class MyClassA(db.Model, Timestamp): a_id = db.Column(db.Integer,
我是一名优秀的程序员,十分优秀!