2011-05-11 72 views
2

所以我有以下情况。我有一个具有以下结构的类DataTypes:sqlAlchemy模型的问题

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的。有什么建议么 ?

问候, 波格丹

+0

你需要使用'的obj .__名字__是,较低的'的(),而不是'obj'宣布孩子的关系是什么时候?关于那部分的一些东西似乎没有,但我承认我对sqlalchemy的经验有限。 – chmullig 2011-05-11 13:47:13

回答

3

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

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

我想这应该是:

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

IE中,对DataType的引用是类,而不是字符串。

+1

我刚才说这可能不是问题,但我认为你可能是对的:声明性扩展确实允许你用字符串引用尚未定义的类,但只能在我认为的类声明内引用。 – Steven 2011-05-11 18:26:20

+0

是的,谢谢你是主要问题。另外我需要将str(obj)传递给backref。 – Bogdan 2011-05-12 07:13:24

0

实际上,只要你使用了声明性扩展,使用数据类型的字符串引用是最简单的,因为声明的顺序并不重要。您只需确保使用相同的基地declarative_base()的1个实例。

this post