Загрузить все связанные объекты без именования таблиц - PullRequest
0 голосов
/ 12 октября 2018

Я впервые использую Flask и SQLAlchemy для создания REST API.Я пытаюсь получить JSON-представление объекта и всех связанных объектов без фактического именования таблиц (схема будет развиваться регулярно).

Давайте создадим запись с внешним ключом для Person.Кроме того, многие со многими связями с приборами:

class Record(Base, Model):
    __tablename__ = 'record'
    id = Column(BigInteger, primary_key=True)
    id_creator = Column(ForeignKey(u'person.id', ondelete=u'SET NULL', onupdate=u'CASCADE', match=u'FULL'), nullable=False)
    person = relationship(u'Person', primaryjoin='Record.id_creator == Person.id')


class Person(Base, Model):
    __tablename__ = 'person'
    id = Column(BigInteger, primary_key=True)
    description = Column(String)

t_many_fixture_has_many_record = Table(
    'many_fixture_has_many_record', metadata,
    Column('id_fixture', ForeignKey(u'fixture.id', ondelete=u'RESTRICT', onupdate=u'CASCADE', match=u'FULL'), primary_key=True, nullable=False),
    Column('id_record', ForeignKey(u'record.id', ondelete=u'RESTRICT', onupdate=u'CASCADE', match=u'FULL'), primary_key=True, nullable=False)
)

class Fixture(Base):
    __tablename__ = 'fixture'
    id = Column(BigInteger, primary_key=True)
    record = relationship(u'Record', secondary=u'many_fixture_has_many_record')

Как создать вывод, который выглядит следующим образом (я гибкий):

{
  "id": 1,
  "person": {
    "id": 12,
    "description": "a description"
  },
  "fixture": [
    {
      "id": 1
    },
    {
      "id": 2
    }
  ]
}

Пока что яудалось получить список объектов, на которые ссылается внешний ключ list_of_dependant_objects = dependent_objects(my_record), но я не знаю, как подойти к остальным.

Любая помощь приветствуется.Спасибо!

1 Ответ

0 голосов
/ 13 октября 2018

За SQLAlchemy стоит SQL, и SQLAlchemy не пытается скрыть его от вас.При этом вы должны указать список таблиц, из которых вы хотите загрузить.И в SQL нет термина, подобного «связанным» таблицам или «зависимым» таблицам.

Если вы не хотите указывать всю структуру таблицы, вы можете использовать атрибут autoload для таблицы, так как он описан в документации по SQLAlchemy:

messages = Table('messages', meta, autoload=True, autoload_with=engine)

Кстати, вы можете использовать очень продвинутый SQL, чтобы выяснить это.В большинстве случаев это не стоит времени, так как этот SQL зависит от базы данных и может измениться с одной версии одной и той же БД на другую.Также вы можете прочитать всю схему БД и попытаться создать график, но между схемами и базами данных могут быть ссылки, о которых вы, возможно, не знаете.

...