1

クラスマッピングを使用して単一テーブルの継承を行う方法の例が見つかりました。SqlAlchemy単一テーブル継承の従来のマッパーの例が必要

http://docs.sqlalchemy.org/en/latest/orm/inheritance.html#single-table-inheritance

しかし、私の人生のために、私は別の私のクラスと永続的なマッピングを維持できるように、古典的なマッパーでこれを行う方法の例を見つけることができません。

このサンプルを古典的なマッピングに変換するにはどうすればよいですか?私はテーブルを作成する上で、実際にマッパーをどのように構築するかは分かりません。

例では、定義された以下の種類があります。

class Employee(Base): 

class Manager(Employee): 

class Engineer(Employee): 

私は適切なテーブルを作成したと仮定:

employee = Table(...Column(type...)) 

私はマッパーのためのコードを書くにはどうすればよいの両方のマネージャーになるようにエンジニアはタイプ(「マネージャ」、「エンジニア」など)によって差別化された同じテーブル(単一テーブル継承)に住んでいますか?

ありがとうございました。

答えて

1

手動でクラス継承階層をマッピングするのは面倒ですが、私はお勧めしませんが、ここにはあります。まずテーブルを定義します。

metadata = MetaData() 

employee = Table(
    'employee', 
    metadata, 
    Column('id', Integer, primary_key=True), 
    Column('name', String(50)), 
    Column('type', String(20)), 
    Column('manager_data', String(50)), 
    Column('engineer_info', String(50)) 
) 

プレーンPythonのクラス:

class Employee: 

    def __init__(self, name): 
     self.name = name 

class Manager(Employee): 

    def __init__(self, name, manager_data): 
     super().__init__(name) 
     self.manager_data = manager_data 

class Engineer(Employee): 

    def __init__(self, name, engineer_info): 
     super().__init__(name) 
     self.engineer_info = engineer_info 

と古典マッピング:

mapper(Employee, employee, 
     polymorphic_on=employee.c.type, 
     polymorphic_identity='employee', 
     exclude_properties={'engineer_info', 'manager_data'}) 


mapper(Manager, 
     inherits=Employee, 
     polymorphic_identity='manager', 
     exclude_properties={'engineer_info'}) 


mapper(Engineer, 
     inherits=Employee, 
     polymorphic_identity='engineer', 
     exclude_properties={'manager_data'}) 

注意あなたがする必要がどのように単一テーブル継承を使用しているので、それは必要なすべての列を含める必要があります各マッパーでマップされたプロパティを手動で制限します。これは、より大きな階層では維持するのが難しくなります。 Declarativeを使用する場合は、すべてあなたのために処理されます。

+0

あなたの注意がうまくいっています。この例を自分のクラスに適用すると、このプロセスがいかに面倒になるかがわかります。 –

+0

宣言は、単一テーブルの継承のためにテーブルとマッパーを少し違った方法で作成するように見えますが、サブクラスを追加するときにテーブルを段階的に定義できるようです。 docsの例では、 'exclude_properties'が使用される唯一の時間は' managerer'です。* manager_data *は除きます。私は手動でそれをよりよくエミュレートする方法を見てみましたが、まだ方法を見つけることができませんでした。おそらくこの答えは将来的に改善されるかもしれません。それでも、除外すべきものと、より大きな階層のテーブルに追加するものを追跡する必要があります。 –

関連する問題