我正在使用SQLAlchemy和load_only
选项。
阅读load_only
文档后,我希望如果使用load_only
,我可以得到一些指定的列。但是结果不是。有所有的专栏,没有一些专栏。我不知道为什么你能给我一些建议吗?
ps。我需要行实体,所以我不使用这样的查询:
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'
答案 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。