我正在構建一個相當簡單的模型使用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()
不過,我我不確定打嗝在哪裏。
請你貼一個回溯。這通常很有用。 –