sqlAlchemy模型的问题

时间:2011-05-11 13:42:57

标签: python sqlalchemy

所以我有以下情况。我有一个类DataTypes,它具有以下结构:

class DataType(Base):
    __tablename__ = 'DATA_TYPES'
    id = Column(Integer, primary_key=True)
    type_name = Column(String)
    fk_result_storage = Column(Integer, ForeignKey('DATA_STORAGES.id'))

    parentDataStorage = relationship("DataStorage", backref=backref("DataType",    cascade="all,delete"))

    def __init__(self, name, resultId):
       self.type_name = name
       self.fk_result_storage = resultId

现在这里定义的关系有效。但是现在我有一些特定的数据类型,这些数据类型是通过内省动态创建的,并且需要同时删除级联。它们是这样创建的:

t = Table('DATA_' + obj.__name__.lower(), *t[:-1], **t[-1])
mapper(obj, t, *args, **kwargs)
model.Base.metadata.create_all(dao.Engine)   

这很好用,并根据需要创建表。但现在我想增加一种关系 类似于DataType类中的那个。所以我尝试了这个:

t = T('DATA_' + obj.__name__.lower(), *t[:-1], **t[-1])
M(obj,t,properties = {'children' : relationship('DataType', backref=backref(obj, cascade="all,delete"))} )   
model.Base.metadata.create_all(dao.Engine)

但是这给了我:

 sqlalchemy.exc.InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers.  Original exception was: relationship 'children' expects a class or a mapper argument (received: <type 'str'>)

我对SQLAlchemy很新。有什么建议吗?

此致 波格丹

2 个答案:

答案 0 :(得分:5)

SQLAlchemy不是我最强的技能,但我认为这个属性是错误的:

properties = {'children' : relationship('DataType', backref=backref(obj, cascade="all,delete"))}

我认为这应该是:

properties = {'children' : relationship(DataType, backref=backref(obj, cascade="all,delete"))}

I.E。,对DataType的引用是类,而不是字符串。

答案 1 :(得分:0)

实际上,只要您使用声明性扩展,使用数据类型的字符串引用是最简单的,因为声明序列无关紧要。您只需确保使用相同的1个Base declarative_base()实例。

请参阅this post