Полиморфизм SQLAlchemy: родительская таблица не существует при создании дочерней записи - PullRequest
0 голосов
/ 07 апреля 2020

При попытке зафиксировать запись возникает следующее исключение:

OperationalError (sqlite3.OperationalError) no such
table: basedocument [SQL: INSERT INTO basedocument (common_field,
doc_type) VALUES (?, ?)] [parameters: ('humanidade', 'user')]

basedocument является родительской таблицей в ассоциации polimorphi c, а user является дочерней таблицей.

Не следует ли создавать родительскую таблицу при создании записи в дочерней таблице?

Вот код:

from sqlalchemy import create_engine, ForeignKey, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy.orm import scoped_session, sessionmaker

engine = create_engine("sqlite:///temp.db")
sessao = scoped_session(sessionmaker(bind=engine))
Base = declarative_base()


class BaseDocument(Base):
    __tablename__ = "basedocument"
    id = Column(Integer, primary_key=True)
    common_field = Column(String)
    doc_type = Column(String(20))
    __mapper_args__ = {
        "polymorphic_identity": "basedocument",
        "polymorphic_on": doc_type,
    }


class User(BaseDocument):
    __tablename__ = "user"
    id = Column(Integer, ForeignKey("basedocument.id"), primary_key=True)
    name = Column(String)
    fullname = Column(String)
    nickname = Column(String)
    __mapper_args__ = {
        "polymorphic_identity": "user",
    }


u1 = User(
    name="Dumont",
    fullname="Santos Dumont",
    nickname="voador",
    common_field="humanidade",
)
sessao.add(u1)
sessao.commit()
print("\nObject:  ", u1)

1 Ответ

0 голосов
/ 09 апреля 2020

Ну, я только что заметил, что забыл использовать

Base.metadata.create_all(engine)

после определения классов. Это то, что действительно создает таблицы.

Этот ответ действителен для многих вопросов об ошибке «Нет такой таблицы».

Правильный код:

from sqlalchemy import create_engine, ForeignKey, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy.orm import scoped_session, sessionmaker

engine = create_engine("sqlite:///temp.db")
sessao = scoped_session(sessionmaker(bind=engine))
Base = declarative_base()


class BaseDocument(Base):
    __tablename__ = "basedocument"
    id = Column(Integer, primary_key=True)
    common_field = Column(String)
    doc_type = Column(String(20))
    __mapper_args__ = {
        "polymorphic_identity": "basedocument",
        "polymorphic_on": doc_type,
    }


class User(BaseDocument):
    __tablename__ = "user"
    id = Column(Integer, ForeignKey("basedocument.id"), primary_key=True)
    name = Column(String)
    fullname = Column(String)
    nickname = Column(String)
    __mapper_args__ = {
        "polymorphic_identity": "user",
    }


Base.metadata.create_all(engine)

u1 = User(
    name="Dumont",
    fullname="Santos Dumont",
    nickname="voador",
    common_field="humanidade",
)
sessao.add(u1)
sessao.commit()
print("\nObject:  ", u1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...