实例化多个AbstractConcreteBase问题

2024-05-23 20:44:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我犯了一个错误,我不明白

在我的_枚举.py你知道吗

class MyEnum(AbstractConcreteBase, Base):
    pass

在enum1.py中

class Enum1(MyEnum):
    years = Column(SmallInteger, default=0)

# class MyEnums1:
#    NONE = Enum1()
#    Y1 = Enum1(years=1)

在enum2.py中

class Enum2(MyEnum):
    class_name_python = Column(String(50))

在测试.py你知道吗

from galileo.copernicus.basic_enum.enum1 import Enum1
from galileo.copernicus.basic_enum.enum2 import Enum2
#...

如果取消对enum1.py中的三行的注释,则在第二次导入时会出现以下错误。你知道吗

AttributeError:类型对象“MyEnum”没有属性“table

但是如果没有MyEnums1,它可以正常工作,或者在单独的文件中使用MyEnums1,它可以正常工作。为什么这个实例化会影响导入?有没有其他方法可以将MyEnums1保存在同一个文件中?你知道吗


Tags: frompybasic错误columnclasscopernicusyears
1条回答
网友
1楼 · 发布于 2024-05-23 20:44:18

abstractconcretebase的目的是将非标准操作顺序应用于标准映射过程。通常,映射的工作方式如下:

  1. 定义要映射的类
  2. 定义表格
  3. 使用mapper()将类映射到表。你知道吗

声明式本质上结合了这三个步骤,但它就是这么做的。你知道吗

当使用抽象具体的基类时,我们需要执行一个非常特殊的步骤—基类需要映射到子类映射到的所有表的一个联合。因此,如果有enum1和enum2,“Base”需要映射到“select*from enum1 UNION ALL select*from enum2”。你知道吗

这种到并集的映射不能逐段进行;MyEnum基类必须同时向mapper()呈现每个子表的完整并集。因此AbstractConcreteBase执行重新安排声明式工作方式的复杂任务,以便在mapper configuration出现之前根本不映射基MyEnum,这在您第一次实例化映射类时发生。然后它插入自己作为所有现有映射子类的映射基。你知道吗

因此,基本上,通过在类级别实例化Enum1()对象,您调用configure\u mappers()的时间太早了,因此当Enum2()出现时,abstractconcretebase已烘焙,进程失败。你知道吗

除此之外,在类级别实例化像Enum1()这样的映射类是完全不正确的。ORM映射对象与全局对象完全相反,必须始终在特定会话的本地创建。你知道吗

edit:这些类上应该有{“concrete”:True},这也是您收到此消息的部分原因。我想看看这个消息是否可以改进。你知道吗

编辑2:是的,这里的机械师很奇怪。我做了一些其他的事情来跳过这个特定的错误消息,尽管它现在失败的方式不同了,也不会更好。要让它更优雅地失败,需要做更多的工作。你知道吗

相关问题 更多 >