2011-05-11 46 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