Возможно ли заполнить внешний ключ SQLalchemy в модели и загрузить его связанный объект

В SQLAlchemy у меня есть модель транзакций , у которой есть связанный член . Это отношение определяется столбцом tlog_ppl_id в таблице транзакций, который ссылается на столбец ppl_id в таблице people (таблица people содержит элементы ).

Предположим, у меня есть новый объект Transactionlog T. Если я загружаю объект-член (позволяет называть его M) и устанавливаю T.member = M, я могу получить доступ к T.member, и он возвращает мой связанный член.

То, что я хотел бы сделать, это иметь мой новый объект SQLAlchemy транзакций SQL и заполнить свойство tlog_ppl_id действительным ppl_id. После этого я хотел бы получить доступ к T.member и SQLAlchemy загрузить запись связанных людей из базы данных. Однако он не делает этого, он возвращает None .

Поэтому мне интересно, может ли SQLAlchemy загружать связанные объекты с помощью определенной команды, если я только заполняю столбцы внешних ключей объектов?

код для проверки:

def test(): from app.models.data import Transactionlog T = Transactionlog() T.tlog_ppl_id = '2433A992-B8C7-4780-91DE-67D12C517C55' print(T.member) return "" 

код в модели:

 class Transactionlog(transactionlog): """ Transactionlog model class. """ member = relationship("People", backref=backref('transactions')) 

Я использую SQLalchemy 1.0.14 на Python 3.5.1 под колбой (не используя флягу-sqlalchemy)

One Solution collect form web for “Возможно ли заполнить внешний ключ SQLalchemy в модели и загрузить его связанный объект”

Если я правильно вас понял, вы можете искать load_on_pending , хотя его использование не рекомендуется:

Флаг load_on_pending не улучшает поведение, когда ORM используется нормально – ссылки на объекты должны быть построены на уровне объекта, а не на уровне внешнего ключа, чтобы они присутствовали обычным способом до того, как поток начнется. Этот флаг не предназначен для общего использования.

Обратите внимание, что во всей test функции вновь созданный экземпляр T не добавляется к сеансу перед попыткой распечатать соответствующий экземпляр People , поэтому он просто не может выполнять какую-либо загрузку (если не играется какая-то магия и все новые экземпляры модели добавлены на некоторый сеанс по умолчанию).

Вот небольшая демонстрация того, как вы, возможно, можете использовать параметр load_on_pending , хотя я думаю, что вам действительно нужно просто использовать объекты экземпляра вместо внешних ключей:

 In [8]: class A(Base): ...: __tablename__ = 'a' ...: a_id = Column(Integer, primary_key=True) In [9]: class B(Base): ...: __tablename__ = 'b' ...: b_id = Column(Integer, primary_key=True, autoincrement=True) ...: a_id = Column(Integer, ForeignKey('a.a_id')) ...: a = relationship('A', load_on_pending=True) In [10]: class C(Base): ...: __tablename__ = 'c' ...: C_id = Column(Integer, primary_key=True, autoincrement=True) ...: a_id = Column(Integer, ForeignKey('a.a_id')) ...: a = relationship('A') In [16]: session.add(A(a_id=1)) In [17]: session.commit() In [18]: b = B() In [19]: session.add(b) In [20]: b.a_id = 1 In [21]: ba Out[21]: <__main__.A at 0x7ff32388ab70> In [22]: session.rollback() In [23]: c = C() In [25]: session.add(c) In [26]: c.a_id = 1 In [27]: ca In [28]: session.commit() In [29]: ca Out[29]: <__main__.A at 0x7ff32388ab70> 

Но, как указывалось ранее, рекомендуемым подходом было бы использование экземпляров, а не внешних ключей:

 # Will look the instance up in the session's identity map, if present T.member = session.query(People).get('2433...') 

Я думаю, что Zen Python применяется в этом случае:

Явный лучше, чем неявный.

Т.е. явным образом запрашиваю связанный объект, вместо того чтобы полагаться на неявный поиск после установки внешнего ключа.

  • Как фильтровать запрос в sqlalchemy по году (столбец datetime)
  • Фляга-Беспокойные свалки Десятичное значение от фляги-шквалы
  • Как получить последнюю запись
  • Родительский экземпляр не связан с сеансом; ленивая загрузка атрибута «account» не может продолжаться
  • Наследование python в sqlalchemy
  • Множественный индекс столбцов при использовании декларативного расширения ORM sqlalchemy
  • Исходный родитель SQLAlchemy при изменении дочерних изменений
  • Сообщение об ошибке Strange SQLAlchemy: TypeError: объект 'dict' не поддерживает индексирование
  •  
    Interesting Posts for Van-Lav

    преобразование файла с разделителями пробелов в CSV

    Не удалось установить пакеты пакетов в Anaconda

    Тупик с протоколированием многопроцессорного / многопоточного скрипта python

    чтение csv-файла без

    Использование Pyserial для построения графика времени от напряжения от последовательного порта Arduino

    Использование лямбда-выражения для подключения слотов в pyqt

    Как сделать управление пакетами Python?

    Как установить цвет границы некоторых виджетов Tkinter?

    как печатать список, пропускающий один элемент каждый раз в python без numpy?

    Почему python позволяет перезаписывать встроенные константы?

    Загрузка собственного текстового набора данных в scikit-learn

    Преобразование unixtime в объект datetime и обратно (пара функций преобразования времени, которые являются обратными)

    декораторы в стандартной библиотеке python (в частности, @deprecated)

    Как установить библиотеки Python?

    Python Imaging: проблемы с YCbCr

    Python - лучший язык программирования в мире.