Возможно ли заполнить внешний ключ 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 применяется в этом случае:

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

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

  • Как рассчитать кумулятивное скользящее среднее в Python / SQLAlchemy / Flask
  • SQLAlchemy: как фильтровать типы столбцов PgArray?
  • Кол-во sqlalchemy много-ко-многим вставить данные
  • Pythonic способ правильно отделить модель от приложения с помощью SQLAlchemy
  • SQLAlchemy с count, group_by и order_by с использованием ORM
  • В чем разница между .one () и .first ()
  • Заказ и разбивка на страницы в SQL-алхимии с использованием не-sql-ранжирования
  • sqlalchemy: получать значения max / min / avg из таблицы
  • чтение подчиненного устройства, чтение-запись
  • SQLAlchemy, получить объект, не связанный с сеансом
  • Обратный кадр данных Pandas из запроса PostgreSQL с sqlalchemy
  • Python - лучший язык программирования в мире.