2011-08-05 8 views
0

ので私は2つの問題を抱えています。だから、私はsqlliteを使うことを余儀なくされ、いくつかのカスケード削除を実装する必要があります。今私は関係が仕事をすることがわかったが、これらは親テーブルで通常宣言されるべきである。しかし、いくつかの設計上の決定のために、私は私が何かやっているので、子供でこれを行うことを余儀なくしています:Pythonのクラス属性とSQL錬金術関係

class Operation(Base): 
    """ 
    The class used to log any action executed in Projects. 
    """ 
    __tablename__ = 'OPERATIONS' 

    id = Column(Integer, primary_key=True) 
    parameters = Column(String) 
    ..... rest of class here .... 

class DataType(Base): 

    __tablename__ = 'DATA_TYPES' 
    id = Column(Integer, primary_key=True) 
    gid = Column(String) 
    ...more params... 
    parent_operation = relationship(Operation, backref=backref("DATA_TYPES", 
                order_by=id, 
                cascade="all,delete")) 
    ...rest of class... 

は今、これが動作しているようですが、私はまだいくつかのかどうか分かりません。

  • まず、ここからparent_operationを使って私は何ができますか?私は、カスケードが動作することを確認しますが、実際の宣言以外はparent_operationを使用しません。第二に

    • 、後方参照の最初のパラメータである子テーブルの名前にするには、この必要性はないか、モデルごとに一意である必要はない上記の場合、中に「DATA_TYPES」?

    • 最後に、私のケースでは、OperationクラスとDataTypeクラスが同じモジュールにあるため、Operationをその関係の最初のパラメータとして渡すことができます。これはケースを波平と私はまだこの関係を宣言したい場合、私は、別のモジュールでそれらを持っているならば今、私は関係を「操作」や「OPERATION」を渡す必要があります(クラス名やテーブル名?)


私の2番目のコアはより重要なPythonですが、それでもまだ上記といくつかの接続があるので、ここでそれを追加します。だから私はクラス属性をdinamically追加することができる必要があります。基本的には、上記のような関係を追加する必要があります。

class BaseClass(object)  

def __init__(self): 
    my_class = self.__class__ 
    if not hasattr(my_class, self.__class__.__name__): 
     reference = "my_class." + self.__class__.__name__ + "= relationship\ 
     ('DataType', backref=backref('" + self.__class__.__name__ + "', \ 
     cascade='all,delete'))" 
     exec reference 

私はこれを行う必要がある理由の理由は複雑であり、いくつかの設計上の決定(基本的に私は「データ型」クラスに宣言した関係を持つように、このいずれかを拡張するすべてのクラスを必要とする)としなければなりません。今私はexecステートメントの使用がそのような良い習慣ではないことを知っています。上記を行うにはより良い方法がありますか?

よろしく、 ボグダン

答えて

0

第二部や、あなたの質問のために、覚えておいて、自分のクラスのコンストラクタに何かがSQLAlchemyので計測されることはありません。あなたの例では、単純に、独自のクラスの関係を宣言することができます(それはあなたがクラスをdeclarative_baseから継承されませんのでご注意)してから、このような任意のサブクラスのもので、それを継承する:

class BaseDataType(object): 
    parent_operation = relationship(Operation, backref="datatype") 

class DataTypeA(Base, BaseDataType): 
    id = Column(Integer, primary_key=True) 

class DataTypeB(Base, BaseDataType): 
    id = Column(Integer, primary_key=True) 

SQLAlchemyのドキュメントが何の良い例を示します可能:

http://www.sqlalchemy.org/docs/orm/extensions/declarative.html#mixing-in-relationships

+0

ありがとう。私の最終的な解決策は、sqlalchemy.ext.declarativeの@declared_attrを使用してそこに関係を作成することでした。 – Bogdan

関連する問題