SQLAlchemy load_only опция не работает, но возвращает все столбцы, а не только указанные столбцы - PullRequest
0 голосов
/ 28 мая 2019

Я использую SQLAlchemy и параметр load_only. После прочтения load_only документов я ожидаю, что если я использую load_only, я смогу получить несколько указанных столбцов. Но результата нет. Были все столбцы, а не некоторые столбцы. Я не знаю почему. Можете дать мне совет?

пс. Мне нужна строка-сущность, поэтому я не использую запрос, подобный этому:

session.query(table.columnA, table.columnB)

введите описание изображения здесь

Я использую SQLAlchemy 1.3.4

class Language(Base):
    __tablename__ = 'language'
    IDX = Column(INTEGER(11), primary_key=True)
    DH_INDEX = Column(ForeignKey('dryhop.DH_INDEX', ondelete='CASCADE', onupdate='CASCADE'), index=True)
    EP_INDEX = Column(ForeignKey('expendables.EP_INDEX', ondelete='CASCADE', onupdate='CASCADE'), index=True)
    LANG_CLASS = Column(String(20), nullable=False)
    LANG_NATION = Column(String(15), nullable=False)
    LANG_COMMENT = Column(Text)
    UPDATE_TIME = Column(DateTime, server_default=text("CURRENT_TIMESTAMP"))

query= session.query(db_model.Language).options(load_only("LANG_COMMENT", "LANG_NATION"))
dir(query.first()) # 'DH_INDEX', 'EP_INDEX', 'IDX','LANG_CLASS', 'LANG_COMMENT', 'LANG_NATION', 'UPDATE_TIME'... ETC

Когда dir(query.first()), я ожидал только два столбца

'LANG_COMMENT', 'LANG_NATION')

но результат

'DH_INDEX', 'EP_INDEX', 'IDX','LANG_CLASS', 'LANG_COMMENT', 'LANG_NATION', 'UPDATE_TIME'

1 Ответ

0 голосов
/ 03 июня 2019

Для данного объекта встроенная функция dir пытается вернуть список допустимых атрибутов для этого объекта.Если рассматриваемый объект не переопределяет функциональность по умолчанию путем реализации __dir__(), список создается для «обычных» объектов следующим образом:

В противном случае список содержитИмена атрибутов объекта, имена атрибутов его класса и рекурсивные атрибуты базовых классов его класса.

Другими словами, список, который вы получаете, является списком загруженных атрибутов (среди прочих) из экземпляра и атрибуты из класса Language, его родителя и т. д.

Если вы хотите убедиться, что загружены только те атрибуты, которые вы хотели, вы можете, например, посмотреть на экземпляр__dict__ атрибут, используя vars():

In [11]: vars(query.first())
Out[11]: 
{'IDX': 1,
 'LANG_COMMENT': 'Comment',
 'LANG_NATION': 'bar',
 '_sa_instance_state': <sqlalchemy.orm.state.InstanceState at 0x7fa6414916d8>}

Или, что еще лучше, используйте проверку SQLAlchemy во время выполнения :

In [37]: from sqlalchemy import inspect

In [38]: obj = query.first()

In [39]: inspect(obj).unloaded
Out[39]: {'DH_INDEX', 'EP_INDEX', 'LANG_CLASS', 'UPDATE_TIME'}

Наконец, обратите внимание, что независимо от того, что вы вводите в load_only(), первичный ключ всегда загружается, потому что не имеет смысла не , даже если вы очень хотел .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...