在SQLAlchemy中,为什么我的load_only不过滤我指定的任何列?

在SQLAlchemy中,为什么我的load_only不过滤我指定的任何列?,第1张

在SQLAlchemy中,为什么我的load_only不过滤我指定的任何列?

没问题,只是有点误会。

<User(email='howard@howard.com', fullname='Howard', company='howard', address='None', password='howard')>

是模型对象的字符串表示形式,

User
它是在
User.__repr__()
访问延迟列时提取延迟列的方法。

使用

load_only()
您定义一组列,以在最初为一个实体加载的同时延迟所有其他列。但是推迟一列并不意味着它某种程度上就无法使用或包含一些“无价值”标记(实际上,它实际上是在幕后)。当第一次引用每个延迟属性时,SQLAlchemy将发出SELECt以便获取其值。从日志中应该显而易见:

In [7]: u = session.query(User).options(load_only(User.email)).first()2018-05-14 16:04:49,218 INFO sqlalchemy.engine.base.Engine SELECT user.id AS user_id, user.email AS user_email FROM user LIMIT ? OFFSET ?2018-05-14 16:04:49,218 INFO sqlalchemy.engine.base.Engine (1, 0)In [8]: u.fullname2018-05-14 16:04:53,773 INFO sqlalchemy.engine.base.Engine SELECt user.fullname AS user_fullname FROM user WHERe user.id = ?2018-05-14 16:04:53,773 INFO sqlalchemy.engine.base.Engine (2,)Out[8]: 'Bar'

您可以使用检查API检查列是否已推迟。

InstanceState.unloaded
保存没有加载值的键集。使用它,您可以将您的内容修改
User.__repr__
为:

class User(base):    ...    def __repr__(self):        state = inspect(self)        def ga(attr): return (repr(getattr(self, attr))         if attr not in state.unloaded         else "<deferred>")        attrs = " ".join([f"{attr.key}={ga(attr.key)}"    for attr in state.attrs])        return f"<User {attrs}>"

或者,您可以遍历 display,
如果尚未加载值,则

InstanceState.attrs
显示
AttributeState.loaded_value
为符号
NO_VALUE

class User(base):    ...    def __repr__(self):        state = inspect(self) attrs = " ".join([f"{attr.key}={attr.loaded_value!r}"    for attr in state.attrs])        return f"<User {attrs}>"


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5096773.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-16
下一篇2022-11-16

发表评论

登录后才能评论

评论列表(0条)

    保存