2012-02-07 21 views
4

sqlalchemy宣言的なクラスの束に使用する予定の単純なミックスインを作成する際に問題があります。基本的なアイデアは、作成/変更タイムスタンプと複数のテーブルに格納されたユーザーの作成/変更をしたいということです。 mixinは独自のファイル(global_mixins.py)にあり、クラスはmixinを必要とする各モデルファイルにインポートされます。データのインポートを実行すると、コードの下にエラーが表示されます。sqlalchemy mixin、foreignkeyおよびrelation

class TimeUserMixin(object): 
    create_time = Column(DateTime,default=datetime.datetime.now,nullable=False) 
    modify_time = Column(DateTime,default=datetime.datetime.now, 
        onupdate=datetime.datetime.now,nullable=False) 

    @declared_attr 
    def create_user_id(cls): 
     return Column(Integer,ForeignKey('tg_user.user_id'), 
         default=cls.get_user_id,nullable=False) 

    @declared_attr 
    def modify_user_id(cls): 
     return Column(Integer,ForeignKey('tg_user.user_id'), 
         default=cls.get_user_id,onupdate=cls.get_user_id,nullable=False) 

    @declared_attr 
    def create_user(cls): 
     return relation('User',primaryjoin='%s.create_user_id == User.user_id'%cls.__name__) 

    @declared_attr 
    def modify_user(cls): 
     return relation('User',primaryjoin='%s.modify_user_id == User.user_id'%cls.__name__) 

    @classmethod 
    def get_user_id(cls): 
     #will eventually return user id if logged in or a generic system user. 
     return 1 

Error(DETAIL: Key (create_user_id)=(1) is not present in table "tg_user".) 
+0

tg_user宣言はありませんか? – Bryan

+0

あなたは何を意味するのかよく分かりません。 tg_userはテーブル名です。クラス名を使用してForeignKeyを設定する必要がありますか? ForeignKey( 'User.user_id')? – Ominus

+0

クラス名ではなくテーブル名でなければなりません。しかし、私はtg_userテーブルのクラスが次のようにどこかで宣言されることを期待しました:http://pastebin.com/3VCAaxJT。それでは、私はミックスインを一度も使ったことがないので、私は純粋にこれらを読んで話しています:http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative.html#mixing-in-relationships – Bryan

答えて

2

これは操作の問題の順序です。私は出力を詳しく読んでいませんでした。基本的には、ユーザーが作成される前にユーザーを割り当てようとしていました。

+0

私はしません同様のシステムを設計している他の人が、コードに類似のバグを作成する可能性があります。あなたの質問は正しい方向に向けるのに役立ちます。あなたが*削除したい場合*あなたの質問の下に*削除*リンクがあるはずです。 –

+0

十分に公正です。私はそれを削除することについての余分なコメントを削除し、それは明日答えたことをマークします。ありがとう。 – Ominus