2012-02-07 96 views
4

我無法創建簡單的mixin,我打算在一堆sqlalchemy聲明類上使用。基本的想法是我想要創建/修改時間戳和存儲在多個表上的創建/修改用戶。 mixin位於其自己的文件(global_mixins.py)中,並且該類在每個需要mixin的模型文件中導入。當我運行數據導入時,出現代碼下面的錯誤。sqlalchemy mixin,foreignkey和關係

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 2012-02-07 20:45:55

+0

不確定你的意思。 tg_user是表名。應該使用類名來設置ForeignKey? ForeignKey('User.user_id')? – Ominus 2012-02-07 20:55:43

+0

它應該是表名,而不是類名。但我期望看到類tg_user表聲明在某處,如下所示:http://pastebin.com/3VCAaxJT。然後,我再也沒有使用過mixins,所以我純粹從閱讀這些內容開始講:http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative.html#mixing-in-relationships – Bryan 2012-02-07 21:09:11

回答

2

這是操作順序問題。我沒有仔細閱讀輸出結果。基本上我試圖在任何用戶創建之前分配一個用戶。

+0

我不會說有必要刪除這個問題 - 其他設計類似系統的人可能會在他們的代碼中創建類似的錯誤 - 而你的問題將有助於他們指出正確的方向。如果你想*刪除它,你的問題應該有一個*刪除*鏈接。 – 2012-02-08 03:50:33

+0

夠公平的。我刪除了關於刪除它的多餘評論,並將在明天將其標記爲答案。謝謝。 – Ominus 2012-02-08 14:16:16