Странный ClassNotMappedError с sqlalchemy и Python - PullRequest
0 голосов
/ 03 октября 2011

Я строю довольно простую модель с использованием sqlalchemy, используя отношение «многие ко многим», определенное таблицей ассоциации, и два класса, которые должны быть связаны с использованием декларативного синтаксиса.

При создании экземпляров в другом местев моем коде, однако, я продолжаю получать 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 является продуктом declarative_base, определенным в database.py следующим образом:

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()

Однако я не уверен, где икота.

1 Ответ

0 голосов
/ 04 октября 2011

immature_product не отображается, поэтому relationship внутри класса ImmatureMirna не может быть сформировано. Измените immature_product на подкласс Base, и я предсказываю, что он будет работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...