gpt4 book ai didi

python - 为多态身份增强 SQLAlchemy 语法

转载 作者:太空狗 更新时间:2023-10-30 00:52:13 26 4
gpt4 key购买 nike

我有一个声明性基类 Entity ,它将列 name 定义为多态的,例如

class Entity(DeclarativeBase):
name = Column('name', String(40))
__mapper_args__ = {'polymorphic_on':name}

在子类中,我现在可以说

class Experiment(Entity):
__mapper_args__ = {'polymorphic_identity': "experiment"}

然后完成。但是,我想为我的库的用户简化子类的创建,因此使以下成为可能:

  • 有更好的语法,不像默认语法那样复杂。这可以是类内的简单赋值poly_id = "exp",也可以是类装饰器。
  • 如果未给出 polymorphic_identity,则从子类的名称中提取名称。

我尝试使用元类来完成这项工作(仅第二部分):

from sqlalchemy.ext.declarative import DeclarativeMeta

class Meta(type):
def __init__(cls, classname, bases, dict_):
dict_["__mapper_args__"] = {'polymorphic_identity': classname}
return super(Meta, cls).__init__(classname, bases, dict_)

class CombinedMeta(Meta, DeclarativeMeta):
pass

class Experiment(Entity):
__metaclass__ = CombinedMeta

因此,在我看来,我的 Meta 应该在调用 DeclarativeMeta 之前设置名称,但它似乎不起作用。因此,要么是因为我搞砸了 MRO,要么是本应设置多态名称的 DeclarativeMeta 永远看不到变化,要么我所做的是完全错误的。我需要更改什么,或者在 SQLAlchemy 中是否已经有类似的东西?

最佳答案

真可惜,但这个问题可以很容易地通过不使用 dict_ 而是直接在 cls 上设置属性来解决。

class Meta(DeclarativeMeta):
def __init__(cls, *args, **kw):
if getattr(cls, '_decl_class_registry', None) is None:
return # they use this in the docs, so maybe its not a bad idea
cls.__mapper_args__ = {'polymorphic_identity': cls.__name__}
return super(Meta, cls).__init__(*args, **kw)

class Experiment(Entity):
__metaclass__ = Meta

关于python - 为多态身份增强 SQLAlchemy 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4460830/

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