Я строю довольно простую модель с использованием 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()
Однако я не уверен, где икота.