SQLAlchemy load_only选项不起作用,但返回所有列,而不仅仅是指定的列

时间:2019-05-28 05:36:49

标签: python sqlalchemy

我正在使用SQLAlchemy和load_only选项。 阅读load_only文档后,我希望如果使用load_only,我可以得到一些指定的列。但是结果不是。有所有的专栏,没有一些专栏。我不知道为什么你能给我一些建议吗?

ps。我需要行实体,所以我不使用这样的查询:

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

enter image description here

我正在使用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 :(得分:0)

给定一个对象,内置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的runtime inspection

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()是什么,即使您it would not make sense not to,主键也总是加载,因为really wanted