2011-10-03 44 views
0

我正在構建一個相當簡單的模型使用sqlalchemy,使用由關聯表定義的多對多關係和兩個要使用聲明性語法關聯的類。奇怪的ClassNotMappedError與sqlalchemy和Python

但是,在我的代碼中的其他地方生成實例時,我一直在獲取ClassNotMappedError。

該模型被定義如下:

from database import Base 

immature_product = Table('immature_products', Base.metadata, 
         Column("immature_id", Integer, 
           ForeignKey("immature_mirna.id"), 
           primary_key=True), 
         Column("mature_id", Integer, 
           ForeignKey("mature_mirna.id"), 
           primary_key=True)) 


class ImmatureMirna(Base): 

    """A class representing an immature miRNA.""" 

    __tablename__ = "immature_mirna" 

    id = Column(Integer, primary_key=True, nullable=False) 
    name = Column(String, unique=True, nullable=False) 
    mature_products = relationship("mature_mirna", secondary=immature_product, 
          backref="precursor") 

    def __init__(self, name): 

     self.name = name 


class MirnaProduct(Base): 

    """A class representing a mature miRNA.""" 

    __tablename__ = "mature_mirna" 

    id = Column(Integer, primary_key=True, nullable=False) 
    mature_id = Column(String, unique=True, nullable=False) 

    def __init__(self, mature_id): 
     self.mature_id = mature_id 

    def __repr__(self): 

     display = "<miRNA product {0} of precursor {1}" 
     display = display.format(self.mature_id, self.precursor) 
     return display 

Base是在database.py定義的declarative_base的產物如下:

engine = create_engine(DB_URL, convert_unicode=True) 
db_session = scoped_session(sessionmaker(bind=engine, autocommit=False, 
            autoflush=False)) 

Base = declarative_base() 
Base.query = db_session.query_property() 

這些都是在模塊的頂部電平部分,沒有任何函數包裝器。同一模塊提供了生成元數據的功能:

def init_db(): 

    "Initializes the database." 

    import models 
    Base.metadata.create_all(bind=engine) 

第三個模塊utils生成實例。代碼的相關位是:

for key in sorted(result): 

    entry = ImmatureMirna(key) 
    db_session.add(entry) 

    for mature_product in result[key]: 
     entry.mature_products.append(MirnaProduct(mature_product)) 

    db_session.commit() 

錯誤發生的那一刻ImmatureMirna被稱爲:

UnmappedClassError: Class 'Table('mature_mirna', MetaData(None), Column('id', Integer(), table=<mature_mirna>, primary_key=True, nullable=False), Column('mature_id', String(), table=<mature_mirna>, nullable=False), schema=None)' is not mapped 

典型使用的代碼是:

>>> from mymodule.database import init_db 
>>> init_db() 
>>> from mymodule.utils import myfunction 
>>> myfunction() 

不過,我我不確定打嗝在哪裏。

+0

請你貼一個回溯。這通常很有用。 –

回答

0

immature_product未映射,因此無法形成類ImmatureMirna中的relationship。將immature_product更改爲Base的子類,我預測它可以正常工作。

+0

我最終重做了很多代碼,但這個問題從根本上說是一個問題。謝謝。 – Einar