0

AbstractConcreteBase で理解できないエラーが発生しました

my_enum.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))

test.py で

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

enum1.py の 3 行のコメントを外すと、2 回目のインポートで次のエラーが発生します。

AttributeError: 型オブジェクト 'MyEnum' には属性 ' table 'がありません

ただし、MyEnums1 がなくても正常に動作するか、別のファイルに MyEnums1 があれば正常に動作します。このインスタンス化がインポートに影響するのはなぜですか? MyEnums1 を同じファイルに保持できる方法はありますか?

4

1 に答える 1

2

abstractconcretebase の目的は、非標準の操作順序を標準のマッピング手順に適用することです。通常、マッピングは次のように機能します。

  1. マップするクラスを定義する
  2. テーブルを定義する
  3. mapper() を使用してクラスをテーブルにマップします。

宣言型は基本的にこれら 3 つのステップを組み合わせたものですが、それが機能します。

抽象具象ベースを使用する場合、このまったく特別な手順を実行する必要があります。基本クラスは、サブクラスがマップされるすべてのテーブルの結合にマップする必要があります。したがって、enum1とenum2がある場合、「ベース」は本質的に「select * from enum1 UNION ALL select * from enum2」にマップする必要があります。

UNION へのこのマッピングは、少しずつ行うことはできません。MyEnum 基本クラスは、すべてのサブテーブルの完全な UNION を一度に mapper() に提示する必要があります。したがって、AbstractConcreteBase は、マップされたクラスを最初にインスタンス化するときに特に発生するマッパー構成が発生するまで、ベース MyEnum がまったくマップされないように、宣言の動作方法を再配置するという複雑なタスクを実行します。次に、既存のマップされたすべてのサブクラスのマップされたベースとして自身を挿入します。

したがって、基本的に、このようにクラス レベルで Enum1() オブジェクトをインスタンス化すると、configure_mappers() の呼び出しが早すぎて、Enum2() が来るまでに、abstractconcretebase がベイクされ、プロセスが失敗します。

それはさておき、 Enum1() のようなマップされたクラスをそのようなクラスレベルでインスタンス化することはまったく正しくありません。ORM マップ オブジェクトは、グローバル オブジェクトとは正反対であり、常に特定のセッションに対してローカルに作成する必要があります。

編集: また、これらのクラスには {"concrete": True} が必要です。これは、このメッセージが表示される理由の一部です。メッセージを改善できるかどうかを確認しようとしています。

編集 2: ええ、ここの仕組みは奇妙です。この特定のエラー メッセージをスキップする何かをコミットしましたが、現在は別の方法で失敗し、それほど良くはありません。これをより適切に失敗させるには、もう少し作業が必要です。

于 2013-02-25T22:46:58.697 に答える