0

我最近将我的 SQLAlchemy 和 FormAlchemy 更新为最新的,发生了一件奇怪的事情。

我确实使用 Mako 模板来显示来自我的模型的数据。

Python:

class Asset(object):
        id = Column(Integer, primary_key=True, nullable=False)
        ...

        @hybrid_property
        def underscore_name(self):
             return "x_underscore_name_x"

马可模板:

  <li>Item: ${Asset.underscore_name}</li>

在升级之前,网页呈现的文本是:

Item: x_underscore_name_x

升级后显示:

Item: Asset.underscore_name

重要的!该方法正在执行,但返回的结果未在网页上呈现。有任何想法吗?

编辑:

负责此行为的库是 SQL Alchemy >=1.1.0。1.0.19 版没有这个问题。让我们看看开发人员的反应是什么。

4

1 回答 1

0

感谢 Michael Bayer,他评论了报告的问题 #4214:显示混合属性名称而不是返回值

Asset.underscore_name 的值是一个 SQL 表达式,它自http://docs.sqlalchemy.org/en/latest/changelog/migration_11.html#hybrid-properties-and-methods-now-propagate-the -docstring-as-well-as-info派生自Core 理解的返回对象的clause_element () 方法。您在上面说明的混合没有正确编写,因为它没有返回 Core SQL 表达式对象:

    s = Session()
    print(s.query(Asset.underscore_name))

sqlalchemy.exc.InvalidRequestError: SQL expression, column, or mapped entity expected - got ''x_underscore_name_x''

如果您正在寻找一个类绑定属性来返回一个字符串,只需分配它:

class Asset(...):
    underscore_name = "x_underscore_name_x"

或者,如果您希望它成为可在类级别调用的方法,请使用@classproperty,这里有一个方法:https ://stackoverflow.com/a/5191224/34549和 SQLAlchemy 有一个您可以复制的方法: https ://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/util/langhelpers.py#L1140

IMO 这里没有错误,因为这不是@hybrid_property 的正确用法

非常感谢迈克尔!

于 2018-03-08T16:23:51.723 回答