2012-02-07 122 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