SQLAlchemy和FormAlchemy显示@hybrid_property名称而不是返回值

时间:2018-03-07 14:46:50

标签: sqlalchemy mako formalchemy

我最近将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"

Mako模板:

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

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

Item: x_underscore_name_x

升级后显示:

Item: Asset.underscore_name

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

修改

负责此行为的库是SQL Alchemy&gt; = 1.1.0。版本1.0.19没有此问题。让我们看看开发人员的回应是什么。

1 个答案:

答案 0 :(得分:0)

Michael Bayer对报道的问题#4214发表了评论: 显示hybrid_property名称而不是返回值

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表达式对象:

performSegue(withIdentifier: "nextScreen", sender: nil)

如果要查找类绑定属性以返回字符串,只需指定它:

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

sqlalchemy.exc.InvalidRequestError: SQL expression, column, or mapped entity expected - got ''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的正确用法

非常感谢迈克尔!