2011-08-05 32 views
0

好了,所以我有两个问题:蟒蛇类的属性和SQL炼金术关系

我的第一个会被SQLAlchemy的关系。所以我不得不使用sqllite,我必须实施一些级联删除。现在我发现关系可以完成这些工作,但是这些工作应该在父表中正常声明。但由于一些设计决策,我不得不这样做的孩子,所以我做这样的事情:

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。

    • 其次,在上述情况下,这是在backref第一个参数,这是否需要为孩子表的名称或是否需要为每模式独特“DATA_TYPES”?

    • 最后,在我的情况下,Operation和DataType类都在同一个模块中,所以我可以将Operation作为关系中的第一个参数传递。现在,如果这wasnt的情况下,我会对他们在单独的模块,如果我还是想声明这个关系,我应该通过“操作”或“操作”的关系(类名或表名?)


现在我的第二个是更多的核心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